假设我们给出了一个MAX堆,我们想要删除任何叶节点,然后删除任何叶节点并保持最大堆属性需要多长时间?
我的主要疑问是 - 是否有时间到达叶节点?
另外,为什么Binary Heaps必须是一个完整的二叉树而不是几乎完整的二叉树?
答案 0 :(得分:1)
在MAX堆中,您可以在 O(logn)中访问堆中的叶节点,因为它是一个完整的二叉树,遍历树的整个高度需要 O(登录)
完成此操作后,您可以再次调用heapify来构建堆,这需要 O(logn)
几乎完整的二叉树与完整二叉树没有区别,只是它有以下两个限制:
在完成当前级别后的每个节点上只进入下一级别。 完成左侧节点后,每个节点都向右移动。
适用于完整二叉树的每个公式都适用于几乎完整的二叉树。
唯一的区别是在几乎完整的二叉树中,从右到左存在最后一级的差距。如果没有间隙则为完全二叉树。
出于效率目的,堆被迫具有竞争二元树的属性
答案 1 :(得分:1)
二进制堆是complete binary tree。所有级别均已满,除了最后一个级别(左端未填写)。二叉树不一定是 full 二叉树。
在数组表示的大小为N的二进制堆中,叶节点位于数组的最后一半。即,从N / 2到N-1的节点是叶节点。删除最后一个节点(即a[N-1]
)是一项O(1)操作:您要做的就是删除节点并减小堆的大小。
删除任何其他叶节点可能是O(log n)操作,因为您必须:
a[N-1]
移动到要删除的节点上。第一部分当然是O(1)。第二部分最多需要log(n) - 1
个移动。 平均值小于2,但最差的情况是log(n) - 1
。