从Max Heap中删除叶节点的时间复杂度?

时间:2018-06-19 05:20:20

标签: algorithm data-structures time-complexity heap binary-heap

假设我们给出了一个MAX堆,我们想要删除任何叶节点,然后删除任何叶节点并保持最大堆属性需要多长时间?

我的主要疑问是 - 是否有时间到达叶节点?

另外,为什么Binary Heaps必须是一个完整的二叉树而不是几乎完整的二叉树?

2 个答案:

答案 0 :(得分:1)

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

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

  3. 几乎完整的二叉树与完整二叉树没有区别,只是它有以下两个限制:

    在完成当前级别后的每个节点上只进入下一级别。 完成左侧节点后,每个节点都向右移动。

  4. 适用于完整二叉树的每个公式都适用于几乎完整的二叉树。

    唯一的区别是在几乎完整的二叉树中,从右到左存在最后一级的差距。如果没有间隙则为完全二叉树。

    出于效率目的,堆被迫具有竞争二元树的属性

答案 1 :(得分:1)

二进制堆是complete binary tree。所有级别均已满,除了最后一个级别(左端未填写)。二叉树不一定是 full 二叉树。

在数组表示的大小为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