数组存树的方式
我们按照层数来看
- 第0层:1 个节点
- 第1层:2 个节点
- 第2层:4 个节点
- 第3层:8 个节点
…
我们可以看出来第$i$层一共有$2^k$个节点
数组中的位置
我们将这样的树存在数组中,我们就可以根据 层数 和 偏移 来表示数组中的节点位置
第$k$层的第$m$个节点:
$2^0 + 2^1 +…+2^{(k-1)}+m = (2^k-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$
我们将左子节点和右子节点在数组中的索引分别定义为 $leftIndex$和$rightIndex$
我们可以得到
$leftIndex=(2^{k+1}-1) + 2m$
$rightIndex = (2^{k+1})+2m$
总结
从上面的推到中将父节点位置设为$i$,那么就可以看出
$leftIndex=(2i+1)$
$rightIndex=(2i+2)$
30+
Posts
8+
Diary
85+
fans