堆(heap)与哈夫曼树(数据结构浙大mooc《树下》)

堆(heap)

优先队列:特殊的队列,取出元素的顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序

采用数组或链表实现优先队列

数组:

  • 插入,元素总是插入尾部 O(1)
  • 删除,查找最大(或最小)关键字O(n),从数组中删去需要移动元素O(n)

链表

  • 插入,元素总是插入链表的头部 O(1)
  • 删除,查找最大(或最小)关键字O(n),删去结点 O(1)

有序数组

  • 插入,找到合适的位置O(n)或O(log2(n)),移动元素并插入
  • 删除,删去最后一个元素O(1)

用二叉树进行存储

采用二叉树结构,重点考虑删除最大值

堆,用完全二叉树实现,都满足任何一个结点值都比他左右两边你的结点值大

堆具有两个特性

  • 结构性,用数组表示的完全二叉树
  • 有序性,任一结点的关键字是其子树所有结点的最大值或最小值
    • 最大堆,大顶堆,最大值
    • 最小堆,小顶堆,最小值
  • 从根结点到任何结点路径上结点序列的有序性

数据对象集,完全二叉树,每个结点的元素值不小于其子结点的元素值

主要操作

MaxHeap Crearte(int maxsize):创建一个空的最大堆

Boolean IsFull(MaxHeap H):判断最大堆H是否已满

Insert(MaxHeap H,elementtype item):将元素item插入最大堆H

Boolean IsEmpty(MaxHeap H),判断最大堆H是否为空

ElementType DeleteMax(MaxHeap H),返回H中最大元素(高优先级)

堆的创建
struct heapstruct
{
	element* elements;//存储堆元素的数组
	int size;//堆的当前元素个数
	int capacity;//堆的最大容量
};
maxheap create(int maxsize)
{
	//创建容量为maxsize的空的最大栈
	maxheap h = (maxheap)malloc(sizeof(struct heapstruct));
	h->elements = (element*)malloc((maxsize + 1) * sizeof(int));
	h->size = 0;
	h->capacity = maxsize;
	h->elements[0] = maxdata;
	//定义哨兵为大于堆中所有可能元素的值,便于以后更快操作
	return h;
}

堆的插入
//最大堆的插入
//算法:将新增结点插入到从其父节点到根节点的有序序列中

void insert(maxheap h, element item)
{//将元素item插入最大值h,其中h->elements[0]已经定义为哨兵
	int i;
	if (isfull(h))
	{
		cout << "最大堆已满" << endl;
		return;
	}
	i =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值