数据结构中的Tree可以使用数组或者链表的形式来保存。对于树的规模以及结构不会经常剧烈变动且很紧凑时可以使用数组保存。
对于完全二叉树,或者满二叉树,可以使用数组方式按照树从上到下从左到右逐层依序保存。
这种情况下对于节点的位置有如下规律:
假设某个节点所在位置索引为n。其左子节点的位置索引为2n+1,而其右子节点的位置索引为2n+2。
下图是个示例:
下面是一个证明过程。
证明:
1:对于根节点:
其索引为0,按照数据保存规则,那么昨子节点索引为1,而右子节点为2。显然满足结论。
2:对于非根节点和非叶子节点:
假设该左子节点所在的索引为x,而该子节点x所在的层的第一个节点的索引为y,x与y之间的节点数为�
所以:
x + � = y
根据满二叉树的规律,我们假设x和y所在的层为i,那么:
y = power(2, i-1) + 1
同样对于x与y之间的�, 可以得到:
x -y = 2 * (n + 1 - (power(2, i-2) + 1))
注:n+1是因为n表示的是索引,而个数是索引+1
分解得到:
� = 2n - power(2, i-1)
所以:
x - y = 2n - power(2, i-1)
进而
x - (power(2, i-1) + 1) = 2n - power(2, i-1)
简化后得到
x = 2n + 1
所以其右子节点的索引为:
(x + 1) = 2n + 2