是否可以从堆中删除随机节点?

时间:2011-04-06 19:25:23

标签: data-structures heap

我有一种情况,我想从堆中删除一个随机节点,我有什么选择?我知道我们可以轻松删除最后一个节点和堆的第一个节点。但是,如果我们说删除最后一个节点,那么我不确定是否正确定义了从堆中删除随机节点的行为。

e.g。

_______________________
|X|12|13|14|18|20|21|22|
------------------------

所以在这种情况下,我可以删除节点12和22,这是定义的,但我可以例如删除一个随机节点,例如比方说13,仍然以某种方式维护堆的完整树属性(以及其他属性)?

2 个答案:

答案 0 :(得分:3)

我假设您正在描述在数组中维护的二进制堆,其中包含A[N] <= A[N*2]A[N] <= A[N*2 + 1](最小堆)的不变量。

如果是,那么删除方法很简单:将删除的元素替换为最后一个元素,并执行大幅下降以确保它最终位于正确的位置。当然,减少包含堆中条目总数的变量。

顺便说一句,如果您正在处理堆示例,我发现使用没有总排序的示例会更好。堆的定义中没有任何内容需要(例如)A[3] <= A[5],如果您的示例有这样的排序,很容易被误导。

答案 1 :(得分:0)

我不认为可以从堆中删除随机元素。我们来看这个例子(遵循相同的惯例):

3, 10, 4, 15, 20, 6, 5.

现在,如果删除元素15,则堆变为:3, 10, 4, 5, 20, 6

这使得堆不一致,因为510的孩子。

我认为随机删除不起作用的原因是因为你可以在堆中替换内部节点(而不是root或leaf),因此有两个路径(父节点和子节点)到heapify (与1pop()情况下的insert()路径相比较。 如果我在这里错过了什么,请告诉我。