在max-heap中,假设一个人使用大于堆中所有项目的项目调用insert()
,然后立即调用deleteMax()
。假设没有重复的密钥。生成的堆是否与这些操作之前的堆相同?
我的回答:在堆中插入最大元素需要O(log n)
,删除最大值也需要O(log n)
。因此,新的insert元素将位于根目录中,旧的max元素(位于根目录下)将被删除。
我的回答是否正确?
答案 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
.