如何确定完整二叉树中给定子树中叶子的索引?
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 |
【讨论】:
这比完美还要好!非常感谢!以上是关于如何确定完整二叉树中给定子树中叶子的索引?的主要内容,如果未能解决你的问题,请参考以下文章