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

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

           0
      /        \
     1          2
   /   \      /   \
  3     4    5     6
 / \   / \  / \   / \
7   8 9 10 11 12 13 14
       ... etc.

可以在O(1)中轻松找到索引x处的节点的子节点和父节点:

child-left(x) = 2x+1
child-right(x) = 2x+2
parent(x) = (x-1)/2

但是有没有办法在O(1)中找到x的最低后代(即具有最高指数的后代)?例如,在上面的树中,x = 0的最低后代将是14,而对于x = 1,它将是10.注意,对于x = 1,如果树中只有10个元素,则应返回9代替.

我可以假设我的数组中永远不会有超过232个元素,因此可以使用位移在O(1)中实现2n.也可能是log_2(???)

最佳答案 好吧,我明白了.节点x的深度是

depth(x) = log2(x+1)

类似地,可以很容易地找到节点x的第i个左子节点和第i个右子节点:

ithLeftChild(x, i) = 2i(x+1) - 1
ithRightChild(x, i) = 2i(x+2) - 2

深度为d的最左边孩子的索引是ithLeftChild(x,d – depth(x)),右边孩子也是如此.

让我们调用最后一个元素n的索引.所以,现在我们可以找到n的深度,我们也可以在那个深度找到leftmostChild和rightmostChild的指标(可能比最后一个元素大,这意味着它们实际上并不存在).

现在我们只有三种情况:

> n< leftmostChild.然后我们的子树在该深度没有元素,因此最高索引必须是父级(rightmostChild).
> leftmostChild< = n< = rightmostChild.那么最高指数必然是n.
> rightmostChild< ñ.然后rightmostChild必须是我们的最高指数.
2i可以在O(1)中实现,用于合理的i使用位移; log2(x)可以在O(1)using a 256-byte lookup table中实现.因此整个算法是O(1).

点赞