堆中删除任意元素

来源:互联网 发布:java json遍历 编辑:程序博客网 时间:2024/05/16 19:26

算法导论6.5-8

def heapDelete(A, i):    A[i], A[-1] = A[-1], A[i]    A.pop()    maxHeap(A, i)

上面这个算法是错误的,因为没有考虑如果替换元素比被替换元素的值更大,那么有可能i的父节点也不能保持最大堆性质的情况。如图,要删除1,用6替换1,3不再保持最大堆性质。

        10       /   \      9     3    /   \  /  \   8    5  1   2  / \ 7   6

修改后的版本

def heapDelete(A, i):    t = A.pop()    if A[i] < t:        # A[i]节点保持最大堆性质,但是A[i]的父节点可能最大堆性质不再保持        heapIncreaseKey(A, i, t)    else:        # A[i]父节点保持最大堆性质,但是A[i]的最大堆性质可能不在保持        A[i] = t        maxHeapify(A, i)
0 0
原创粉丝点击