建堆时,最坏情况下需要挪动元素次数是等于树中各结点的高度和。问:对于元素个数为12的堆,其各结点的高度之和是多少?
A. 10
B. 11
C 12
D 15
良心解答:
首先,堆是一个完全二叉树;
其次,该题是求需要下沉的结点的高度和;
最后,分析,最后一层5个元素,第7个结点是叶子结点,高度是0,
4,5,6最多下沉一次,高度为1,
2,3最多下沉2次,高度为2,
1最后下沉3次,高度为3,
3*1+2*2+1*3=10
最大堆删除操作和建立都是以添加新元素为基础,依次对比父节点和孩子结点,下沉。
void PercDown(int A[],int p,int N)
{
int father,son;
int X;
int X=A[p];
for(father=p;(father*2)<N;father=son) //下标为0的元素为哨兵;
{
son=father*2;
if((son!=N-1)&&A[son]<A[son+1])
//判断son不是最后一个元素
son++;//
if(X>=A[son]) break;
else
A[father]=A[son];
}
A[father]=X;
}