用完全二叉树来表示

特性:1.结构性,用数组表示的完全二叉树。2.有序性,任一结点的关键字是其子树所有结点的最大值(或最小值)

 

#include<iostream>
using namespace std;

typedef struct heap *maxheap;
struct heap{
	int *elements;
	int size;//堆的当前元素个数
	int capacity;//最大容量
};
//创建容量为maxsize的空的最大堆
maxheap creat(int maxsize)
{
	maxheap h = (heap*)malloc(sizeof(heap));
	h->elements = (int*)malloc((maxsize+1)*sizeof(heap));//从下标1开始存储
	h->size = 0;
	h->capacity = maxsize;
	h->elements[0] = INT_MAX;//哨兵

	return h;
}

//插入
void insert(maxheap h, int item)
{
	int i;
	if(h->size == h->capacity)
	{
		printf("满");
		return;
	}
	i = ++h->size;
	//这插入时有点像插入排序,为item找到合适的位置
	for(; h->elements[i / 2] < item; i = i / 2)
		h->elements[i] = h->elements[i / 2];
	h->elements[i] = item;
}

//删除
int deleteMax(maxheap h)
{
	int parent, child;
	int maxitem, temp;
	if(h->size == 0)
	{
		printf("空");
		return;
	}
	maxitem = h->elements[1];//取出根结点,也就是最大值
	temp = h->elements[h->size--];//取出最后一个结点
	//假设tmp是放到根结点,然后开始向下比较
	for(parent = 1; parent * 2 <= h->size; parent = child)
	{
		child = parent * 2;
		//如果有右孩子且右孩子的值大于左孩子
		if((child != h->size) && (h->elements[child]) < (h->elements[child + 1]))
			child++;//找到了左右孩子中更大的
		//如果temp更大,那么现在这个位置他是可以“坐稳”的,跳出,否则就将更大的孩子提上来
		if(temp >= h->elements[child])
			break;
		else
			h->elements[parent] = h->elements[child];
		//一趟结束后,parent就去到更大的孩子的下标的位置
	}
	h->elements[parent] = temp;

	return maxitem;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值