算法导论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)