最大堆小习题

建堆时,最坏情况下需要挪动元素次数是等于树中各结点的高度和。问:对于元素个数为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值