Arrays 确定O(1)中基于数组的二叉树中的最低子节点(具有最大索引的后代)?

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=

一些二叉树结构(如堆)可以通过从左到右、从上到下设置索引来使用数组实现

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=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
    ??为什么不
    7
    ?在这种情况下,“最低”一词的确切含义是什么?@AndreyT他在最新的编辑中将其描述为“具有最高索引的后代”。他正要键入这个精确的解决方案,却因工作而分心,不过他为了弄明白它而加了1。 depth(x) = log2(x+1) ithLeftChild(x, i) = 2i(x+1) - 1 ithRightChild(x, i) = 2i(x+2) - 2