Arrays 确定O(1)中基于数组的二叉树中的最低子节点(具有最大索引的后代)?
一些二叉树结构(如堆)可以通过从左到右、从上到下设置索引来使用数组实现 0 / \ 1 2 / \ / \ 3 4 5 6 / \ / \ / \ / \ 7 8 9 10 11 12 13 14 ... etc. 但是有没有办法在O(1)中找到x的最低后代(即指数最高的后代)?例如,在上面的树中,Arrays 确定O(1)中基于数组的二叉树中的最低子节点(具有最大索引的后代)?,arrays,algorithm,math,data-structures,binary-tree,Arrays,Algorithm,Math,Data Structures,Binary Tree,一些二叉树结构(如堆)可以通过从左到右、从上到下设置索引来使用数组实现 0 / \ 1 2 / \ / \ 3 4 5 6 / \ / \ / \ / \ 7 8 9 10 11 12 13 14 ... etc. 但是有没有办法在O(1)中找到x的最低后代(即指数最高的后代)?例如,在上面的树中,x=0的最低子代是14,而x=1的最低子代是10。请注意,对于x=
x=0
的最低子代是14,而x=1
的最低子代是10
。请注意,对于x=1
,如果树中只有10个元素,它应该返回9
我可以假设我的数组中永远不会有超过232个元素,所以2n可以使用位移位在O(1)中实现。可能是
log_2
以及(???)嗯,我想出来了。节点x的深度为
depth(x) = log2(x+1)
在深度d
处最左边的子项的索引是ithLeftChild(x,d-depth(x))
,对于右边的子项也是如此
让我们调用最后一个元素的索引n
。因此,现在我们可以找到n
的深度,我们还可以找到leftmostChild
和rightmostChild
在该深度的标记(可能大于最后一个元素,这意味着它们实际上不存在)
现在我们只有三个案例:
。那么我们的子树在那个深度没有元素,所以最高的索引必须是n
parent(rightmostChild)
leftmostChild作为一个愚蠢的逃避答案,如果数组中最多有2^32个元素,那么您总是可以预先计算所有元素并在O(1)中的查找表中查找答案二叉树是否一定是一个完美的二叉树(即,没有缺失的节点),或者底层是否缺少一些节点?@templatetypedef:不,不一定是完美的为什么
的N=10
的最低子代是1
??为什么不9
?在这种情况下,“最低”一词的确切含义是什么?@AndreyT他在最新的编辑中将其描述为“具有最高索引的后代”。他正要键入这个精确的解决方案,却因工作而分心,不过他为了弄明白它而加了1。 depth(x) = log2(x+1) ithLeftChild(x, i) = 2i(x+1) - 1 ithRightChild(x, i) = 2i(x+2) - 27