小灰的算法之旅:数组存储二叉树以及使用数组存储时父节点和子节点下标关系的证明

二叉树的一些基础概念

二叉树(binary tree)是树的一种特殊形式。二叉,顾名思义,这种树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点。

二叉树节点的两个孩子节点,一个被称为左孩子(left child),一个被称为右孩子(right child)。这两个孩子节点的顺序是固定的,就像人的左手就是左手,右手就是右手,不能够颠倒或混淆。

此外,二叉树还有两种特殊形式,一个叫作满二叉树,另一个叫作完全二叉树。

满二叉树:一个二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。

完全二叉树:对一个有n个节点的二叉树,按层级顺序编号,则所有节点的编号为从1到n。如果这个树所有节点和同样深度的满二叉树的编号为从1到n的节点位置相同,则这个二叉树为完全二叉树。

这个定义还真绕,看看下图就很容易理解了。

在上图中,二叉树编号从1到12的12个节点,和前面满二叉树编号从1到12的节点位置完全对应。因此这个树是完全二叉树。其实这里只需要满足最后一个节点之前的节点都是满的即可,中间不能有缺失的节点。完全二叉树的条件没有满二叉树那么苛刻:满二叉树要求所有分支都是满的;而完全
二叉树只需保证最后一个节点之前的节点都齐全即可。

链表是如何存储二叉树的


上一章讲过链表,链表是一对一的存储方式,每一个链表节点拥有data变量和一个指向下一节点的next指针。而二叉树稍微复杂一些,一个节点最多可以指向左右两个孩子节点,所以二叉树的每一个节点包含3部分。

  • 存储数据的data变量
  • 指向左孩子的left指针
  • 指向右孩子的right指针

数组是如何存储二叉树的

使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或右孩子空缺,则数组的相应位置也空出来。
为什么这样设计呢?因为这样可以更方便地在数组中定位二叉树的孩子节点和父节点。

假设一个父节点的下标是parent,那么它的左孩子节点下标就是2×parent + 1;右孩子节点下标就是2×parent + 2。反过来,假设一个左孩子节点的下标是leftChild,那么它的父节点下标就是(leftChild-1)/ 2。
显然,对于一个稀疏的二叉树来说,用数组表示法是非常浪费空间的。

数组存储时父子节点的下标关系证明

由于是二叉树,每个节点都可以分成左右两个子节点,我们假设树高为k,则第一层节点个数为2的0次方,结果1,为根节点,在数组中的下标为0,第二层节点个数为2的1次方,有2个节点,下标分别为,1和2.......哈哈,感觉描述起来不好理解,我画个图😄

posted @ 2020-12-23 16:13  皮卡丘和羊宝贝😄  阅读(581)  评论(0编辑  收藏  举报