【数据结构】二叉树的数组表示推导
数组存树的方式
我们按照层数来看
- 第0层:1 个节点
- 第1层:2 个节点
- 第2层:4 个节点
- 第3层:8 个节点
…
我们可以看出来第iii层一共有2k2^k2k个节点
数组中的位置
我们将这样的树存在数组中,我们就可以根据 层数 和 偏移 来表示数组中的节点位置
第kkk层的第mmm个节点:
20+21+...+2(k−1)+m=(2k−1)+m2^0 + 2^1 +...+2^{(k-1)}+m = (2^k-1)+m20+21+...+2(k−1)+m=(2k−1)+m
子节点位置
从父节点到左子节点之间的节点个数为该层剩余 + 下一层到子节点之前的节点个数,也就是
$ 2^k-m + 2*(m-1) + 1 $
所以子节点的位置为
$ (2^k-1) + m + 2^k-m + 2*(m-1) + 1 = 2^{k+1}-1+2m $
我们将左子节点和右子节点在数组中的索引分别定义为 leftIndexleftIndexleftIndex和rightIndexrightIndexrightIndex
我们可以得到
leftIndex=(2k+1−1)+2mleftIndex=(2^{k+1}-1) + 2mleftIndex=(2k+1−1)+2m
rightIndex=(2k+1)+2mrightIndex = (2^{k+1})+2mrightIndex=(2k+1)+2m
总结
从上面的推到中将父节点位置设为iii,那么就可以看出
leftIndex=(2i+1)leftIndex=(2i+1)leftIndex=(2i+1)
rightIndex=(2i+2)rightIndex=(2i+2)rightIndex=(2i+2)