从最大堆中删除叶节点的时间复杂度?

Time complexity to delete a leaf node from Max Heap?

假设我们有一个最大堆,我们想删除任何叶节点,那么删除任何叶节点并保持最大堆需要多少时间属性 ?

我的主要疑问是 - 到达叶节点是否需要 O(n) 时间?

另外,为什么二叉堆必须是完全二叉树而不是几乎完全二叉树?

  1. 在MAX堆中你可以在O(logn)中访问堆中的叶子节点,因为它是一个完整的二叉树并遍历整个高度树的需要 O(logn)

  2. 完成后,您可以调用 heapify 再次构建堆,这需要 O(logn)

  3. Almost Complete Binary Tree 与 Complete Binary Tree 没有区别,只是它有以下两个限制:

    在每个节点完成当前关卡后才进入下一个关卡。 在左节点完成后的每个节点转到右。

所有适用于完全二叉树的公式都适用于几乎完全二叉树。

唯一的区别是在几乎完整的二叉树中,从右到左的最后一层有一个间隙。如果没有间隙就是完全二叉树。

为了提高效率,堆被迫具有这种 属性 作为竞争二叉树的特性

二进制堆是 complete binary tree。所有级别都已满,可能最后一个级别除外,它是左填充的。二叉树不一定是二叉树。

在一个大小为N的二叉堆中,用数组表示,叶节点在数组的后半部分。即从N/2到N-1的节点为叶节点。删除最后一个节点(即 a[N-1])是一个 O(1) 操作:您所要做的就是删除节点并减小堆的大小。

删除任何其他叶节点可能是一个 O(log n) 操作,因为您必须:

  1. 将最后一个节点 a[N-1] 移动到您要删除的节点。
  2. 将该项目冒泡到堆中,到适当的位置。

第一部分当然是 O(1)。第二部分最多需要 log(n) - 1 步。 平均值小于2,但最坏情况是log(n) - 1.