通过从左到右,从上到下设置索引,可以使用数组实现一些二叉树结构(例如堆)
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).