二叉树的数组表示推导

29 阅读1分钟

数组存树的方式

我们按照层数来看

  1. 第0层:1 个节点
  2. 第1层:2 个节点
  3. 第2层:4 个节点
  4. 第3层:8 个节点 ... 我们可以看出来第ii层一共有2k2^k个节点

数组中的位置

我们将这样的树存在数组中,我们就可以根据 层数 和 偏移 来表示数组中的节点位置 第kk层的第mm个节点: 20+21+...+2(k1)+m=(2k1)+m2^0 + 2^1 +...+2^{(k-1)}+m = (2^k-1)+m

子节点位置

从父节点到左子节点之间的节点个数为该层剩余 + 下一层到子节点之前的节点个数,也就是 2km+2(m1)+12^k-m + 2*(m-1) + 1 所以子节点的位置为 (2k1)+m+2km+2(m1)+1=2k+11+2m(2^k-1) + m + 2^k-m + 2*(m-1) + 1 = 2^{k+1}-1+2m 我们将左子节点和右子节点在数组中的索引分别定义为 leftIndexleftIndexrightIndexrightIndex

我们可以得到 leftIndex=(2k+11)+2mleftIndex=(2^{k+1}-1) + 2m rightIndex=(2k+1)+2mrightIndex = (2^{k+1})+2m

总结

从上面的推到中将父节点位置设为ii,那么就可以看出 leftIndex=(2i+1)leftIndex=(2i+1) rightIndex=(2i+2)rightIndex=(2i+2)