繁体   English   中英

完整和完整的二叉树最大和最小索引?

[英]Complete AND Full Binary tree max and min indexes?

我不确定我是否考虑得过多,但我无法想到一般情况下的解决方案:(

在此处输入图片说明

至于我们存储具有在任何节点左子树的右子树更大的价值和更小的值的节点,在节点Bottom Right拐角处将具有最大值,并在节点Bottom Left角落都将具有最小值。

所以现在您需要找到节点。 假定树是Complete and Full BST并且还存储在Array中,因此索引均匀地分布在节点上。 因此,如果有n节点,我们需要Top to BottomLeft to Right分配索引,以从1n节点开始分配索引。

因此,如果我们为给定的树编写索引,

                            1
                         /     \
                        2       3
                      /   \   /   \
                     4     5 6     7
                    / \           ^^^-------------Largest value
                   8   9
Smallest value----^^^

因此,此处具有8索引的节点将具有最小值,而具有7索引的节点将具有最大值。

所以现在的问题是如何找到它。 因此,假设我们有一棵树,层级为l则最大值的索引将为2^level - 1 ,最小值为2^level的索引。但是,此处获得的最大值的索引可能会给我们一个错误的答案如果total_nodes = 2^level-1 因此,我们需要通过考虑total_nodes = n+1来以不同的方式来计算level

int level = (int)(Math.ceil ( Math.log(n)/Math.log(2) ));    //For index of smallest value;
int smallest_index = (int) Math.pow (2,level);

level = (int)(Math.ceil ( Math.log(n+1)/Math.log(2) ));    //For index of largest value;
int largest_index = (int) Math.pow (2,level) - 1;

Sanket的回答基本上是正确的,但是最终声明的方式使我感到不舒服。 谁说两个舍入(!)日志的舍入(!)比率不会舍入到比预期整数稍高一点? 然后ceil会一直将其抬起。 也许可以用,但是本质上是偶然的,而不是设计的。

在按位算术方面,也可以“干净”地陈述,而无需考虑/担心此类事情。 一切都保持整数,因此更容易推理。

最低项的索引为n存在的2的最高幂,因此为最高置位位。 在Java中甚至有一个函数: Integer.highestOneBit ,或者我们可以编写它:

int highestOneBit(int x) {
    x |= x >> 16;
    x |= x >> 8;
    x |= x >> 4;
    x |= x >> 2;
    x |= x >> 1;
    return x ^ (x >>> 1);
}

现在我们有了

indexOfLowest = highestOneBit(n);
indexOfHighest = highestOneBit(n + 1) - 1;

这仍然假定基于1的索引(未使用索引0),您可以将所有索引简单地偏移1以使其为0索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM