[英]getting min and max height of a tree in one traversal of Binary tree in Java?
[英]Complete AND Full Binary tree max and min indexes?
至于我们存储具有在任何节点左子树的右子树更大的价值和更小的值的节点,在节点Bottom Right
拐角处将具有最大值,并在节点Bottom Left
角落都将具有最小值。
所以现在您需要找到节点。 假定树是Complete and Full BST
并且还存储在Array中,因此索引均匀地分布在节点上。 因此,如果有n
节点,我们需要Top to Bottom
和Left to Right
分配索引,以从1
到n
节点开始分配索引。
因此,如果我们为给定的树编写索引,
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.