最大堆(插入和删除)

时间:2014-06-04 06:39:21

标签: algorithm heap

在max-heap中,假设一个人使用大于堆中所有项目的项目调用insert(),然后立即调用deleteMax()。假设没有重复的密钥。生成的堆是否与这些操作之前的堆相同?

我的回答:在堆中插入最大元素需要O(log n),删除最大值也需要O(log n)。因此,新的insert元素将位于根目录中,旧的max元素(位于根目录下)将被删除。

我的回答是否正确?

1 个答案:

答案 0 :(得分:3)

如果没有重复,新堆将与原始堆完全相同。

这是因为当你添加一个大元素时,它最初被添加为一个叶子,它会冒泡到顶部。 通过不断地将原始父级(原始大型节点)元素与自身交换来实现。

现在当你删除Max()时,root被清空(或填充树的最后一个节点)。所以更大的孩子取而代之。这个较大的孩子是树的原始根。因此冒泡下来就像冒泡一样。

如果有重复项,那么在删除时,其中一个孩子可以获取空根的位置。因此,不能保证最终的树是相同的。

例如没有重复项,

原树:

       10
     7    6
   4
.

添加11:

       10
     7    6
   4  11
.
       10
     11    6
   4   7
.
       11
     10   6
   4   7
.

现在deleteMax():

       _
    10   6
  4   7
.
       10
     _    6
   4   7
.
       10
     7    6
   4
.

或者作为@CaptainCodeman建议的deleteMax()的其他实现:

       7
    10   6
  4   
.
       10
     7    6
   4   
.

有重复项:

原树:

       10
     7    10
   4
.

添加11:

       10
     7    10
   4  11
.
       10
     11    10
   4   7
.
       11
     10   10
   4   7
.

现在deleteMax():

       _
    10   10
  4   7
.
       10
     10   _  // the right child can also take its place
   4   7
.

或者作为@CaptainCodeman建议的deleteMax()的其他实现:

       7
    10   10
  4   
.
       10
     10    7 // the right child can also take its place
   4   
.