我有一种情况,我想从堆中删除一个随机节点,我有什么选择?我知道我们可以轻松删除最后一个节点和堆的第一个节点。但是,如果我们说删除最后一个节点,那么我不确定是否正确定义了从堆中删除随机节点的行为。
e.g。
_______________________
|X|12|13|14|18|20|21|22|
------------------------
所以在这种情况下,我可以删除节点12和22,这是定义的,但我可以例如删除一个随机节点,例如比方说13,仍然以某种方式维护堆的完整树属性(以及其他属性)?
答案 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
这使得堆不一致,因为5
是10
的孩子。
我认为随机删除不起作用的原因是因为你可以在堆中替换内部节点(而不是root或leaf),因此有两个路径(父节点和子节点)到heapify
(与1
或pop()
情况下的insert()
路径相比较。
如果我在这里错过了什么,请告诉我。