如何确定完整二叉树中给定子树中叶子的索引?

Posted

技术标签:

【中文标题】如何确定完整二叉树中给定子树中叶子的索引?【英文标题】:How to determine the indexes of the leaves in a given subtree in a complete binary tree? 【发布时间】:2021-12-10 23:12:01 【问题描述】:

我有一个数组表示法的完整二叉树(宽度优先):

[15, 10, 5, 3, 7, 5, 0, 1, 2, 3, 4, 5, 0, 0, 0]

所以所有叶子的索引是:7、8、9、10、11、12、13、14。

对于每个内部节点,我需要返回其子树中叶子的索引:

节点 15: 7、8、9、10、11、12、13、14 节点 10: 7、8、9、10 节点 5: 11、12、13、14 节点 3: 7、8 节点 7: 9、10 节点 5: 11、12 节点 0: 13、14。

是否存在任何公式?

【问题讨论】:

数组如何描绘一棵树?逻辑是什么? 19 怎么可能是这个数组中的索引?为什么索引 8 处的叶子同时是节点 3 和节点 7 下方的叶子? 对不起 19,现在是 9。 零元素 (15) 是根,第一个 (10) 和第二个 (5) 是根的子元素。第三个 (3) 和第四个 (7) 是第二个元素的子元素,依此类推。因此,叶子是:1、2、3、4、5、0、0、0,它们的索引是7、8、9、10、11、12、13、14。 那么为什么索引 8 既是节点 3 和节点 7 下方的叶子呢? 好的,它是否总是一棵完美树?还是底层不能完全填满? 【参考方案1】:

由于数组表示一棵完美的二叉树,即所有内部节点都有 2 个子节点,并且所有叶子都位于相同的深度,因此数组长度将始终是 2 的幂减 1。在示例中它是 24-1。那个力量就是树的层数……比树的高度多一。我们称高度为ℎ,那么输入数组的大小为2ℎ+1-1。

我们可以使用 position 数字的二进制表示。位置我的意思是 index 加 1。所以根的位置是 1,它的子节点的位置是 2 和 3。使用 ℎ+1 二进制数字以二进制表示形式表示每个位置。因此,对于示例输入,您将使用 4 位数字。要知道给定位置以下叶子的位置范围,请查看位置编号中有多少个前导零。

例如,取位置 3(示例树的值为 5),即 0011 二进制 4 位数。它有 2 个前导零。

现在删除那些前导零。例如,我们得到二进制 11。

现在完成这些数字在右边与任何数字再次有4个数字。这表示叶子的位置范围。在示例中:1100 到 1111。然后您可以将其转回十进制并减去 1 以获得索引:11,12,13,14。

这是一个表格,用于对示例中的所有内部节点进行此计算:

Index Value Position Position (binary) Shift Range In decimal Indices
0 15 1 0001 1*** 1000-1111 8-15 7-14
1 10 2 0010 10** 1000-1011 8-11 7-10
2 5 3 0011 11** 1100-1111 12-15 11-14
3 3 4 0100 100* 1000-1001 8,9 7,8
4 7 5 0101 101* 1010-1011 10,11 9,10
5 5 6 0110 110* 1100-1101 12,13 11,12
6 0 7 0111 111* 1110-1111 14,15 13,14

【讨论】:

这比完美还要好!非常感谢!

以上是关于如何确定完整二叉树中给定子树中叶子的索引?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树

题目3. 平衡二叉树算法查找树中某节点的时间复杂度是多少?

二叉树及其遍历

二叉树

十五:查找二叉树中所有路径

二叉树