数组存树的方式
我们按照层数来看
- 第0层:1 个节点
- 第1层:2 个节点
- 第2层:4 个节点
- 第3层:8 个节点
...
我们可以看出来第i层一共有2k个节点
数组中的位置
我们将这样的树存在数组中,我们就可以根据 层数 和 偏移 来表示数组中的节点位置
第k层的第m个节点:
20+21+...+2(k−1)+m=(2k−1)+m
子节点位置
从父节点到左子节点之间的节点个数为该层剩余 + 下一层到子节点之前的节点个数,也就是
2k−m+2∗(m−1)+1
所以子节点的位置为
(2k−1)+m+2k−m+2∗(m−1)+1=2k+1−1+2m
我们将左子节点和右子节点在数组中的索引分别定义为 leftIndex和rightIndex
我们可以得到
leftIndex=(2k+1−1)+2m
rightIndex=(2k+1)+2m
总结
从上面的推到中将父节点位置设为i,那么就可以看出
leftIndex=(2i+1)
rightIndex=(2i+2)