题目:HEAP-DELETE(A,i)操作将节点i中的项从堆中删去。对含n个元素的最大堆,请给出时间为O(lgn)的HEAP-DELETE的实现。
编程思路:
我们可以用堆中最后一个元素a[heapSize]放到节点i 位置,然后将heapSize减一。然后就涉及到堆调整以保持堆的性质。
调整的依据就是这最后一个元素a[heapSize]跟原来i节点的元素a[i]的相对大小,分三种情况:
(1)当a[heapSize]==a[i]时,最大堆不用调整。时间复杂度为O(1)
(2)当a[heapSize]<a[i]时,以i节点为根的子分支堆性质遭到破坏,其他地方不变,所以这里直接调用保持堆性质的函数MaxHeapIfy()进行堆调整即可。时间复杂度为O(lgn)
(3)当a[heapSize]>a[i]时,这种情况类似于“将优先队列的某个元素关键字值增大到k”的操作,所以直接调用HeapIncreaseKey()函数即可。时间复杂度为O(lgn)
实现代码如下:
//堆调整,保持堆的性质
void MaxHeapIfy(int *a,int i,int heapSize)
{
int largest=0;
int left=0;
int right=0;
int tmp=0;
if(left<=heapSize&&a[i]<a[left])
{
largest=left;
}
else
{
largest=i;
}
if(right<&#