banner
express binary tree by array

二叉树的数组表示推导

Scroll down

数组存树的方式

我们按照层数来看

  1. 第0层:1 个节点
  2. 第1层:2 个节点
  3. 第2层:4 个节点
  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)$

其他文章
cover
gitlet文档翻译 & 人话版
  • 25/09/26
  • 10:20
  • 数据结构
30+
Posts
8+
Diary
85+
fans
目录导航 置顶
  1. 1. 数组存树的方式
  2. 2. 数组中的位置
  3. 3. 子节点位置
  4. 4. 总结