最大堆数据结构

堆的定义

存储结构:堆中元素在数组中是按照完全二叉树层序存储的。数组起始结点为1。
下标特点:对于下标为i的结点,i/2为父节点,左右子结点分别为2i和2i+1。
最大堆特点:任一结点的值大于或者等于其子结点的值。
最小堆特点:任一结点的值小于或者等于其子结点的值。

堆数据结构

#include<stdio.h>
#include <malloc.h>
#define MAXDATA 1000

typedef struct HNode
{
	int* data;
	int size;
	int capacity;
}*MaxHeap,MinHeap;

MaxHeap CreateHeap(int MaxSize)
{
	MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));
	H->data = (int*)malloc((MaxSize + 1) * sizeof(int));
	H->size = 0;
	H->capacity = MaxSize;
	H->data[0] = MAXDATA;
	return H;
}

bool IsFull(MaxHeap H)
{
	return(H->size == H->capacity);
}

bool Insert(MaxHeap H, int x)
{
	int i;
	if (IsFull(H))
	{
		printf_s("最大堆已经满了");
		return false;
	}
	i = ++H->size;
	for (; H->data[i / 2] < x; i /= 2)
	{
		H->data[i] = H->data[i / 2];//i/2父节点
	}
	H->data[i] = x;
	return true;
}

bool IsEmpty(MaxHeap H)
{
	return(H->size == 0);
}

int DeleteMax(MaxHeap H)
{
	int parent, child;
	int MaxItem, x;
	if (IsEmpty(H))
	{
		printf_s("最大堆已空");
		return -1;
	}
	MaxItem = H->data[1];
	x = H->data[H->size--];
	for (parent = 1; parent * 2 <= H->size; parent = child)
	{
		child = parent * 2;
		if ((child != H->size) && (H->data[child] < H->data[child + 1]))
		{
			child++;
		}
		if (x >= H->data[child])break;
		else
			H->data[parent] = H->data[child];
	}
	H->data[parent] = x;
	return MaxItem;
}

int main()
{
	MaxHeap H;
	H=CreateHeap(100);
	Insert(H, 1);
}
typedef struct HNode
{
	int* data;
	int size;
	int capacity;
}*MaxHeap,MinHeap;

MaxHeap CreateHeap(int MaxSize)
{
	MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));
	H->data = (int*)malloc((MaxSize + 1) * sizeof(int));
	H->size = 0;
	H->capacity = MaxSize;
	H->data[0] = MAXDATA;
	return H;
}

插入

最大堆插入元素后依然要保持完全二叉树的性质。插入结点按照序号插入。
最大堆插入方式:由于最大堆从根节点到任何叶结点的路径是递降的有序数列,因此插入的方式是用插入结点和父结点比较大小,如果插入结点大则互换位置,反之则插入。
在这里插入图片描述

删除

最大堆的删除:取出根结点的最大元素值,同时删除一个结点(数组中最后一个单元即堆中的最后一个结点)
在这里插入图片描述

堆排序

https://www.cnblogs.com/payapa/p/11192303.html

哈夫曼树

哈夫曼树构造(不唯一)
1.确定有n个权值的集合构造n棵单结点二叉树。
2.选择两个最小的结点作为左右子树,两个结点的权值和作为父节点3.将整棵树放入集合中,寻找集合中最小的结点和这个树的父节点作为左右子树,和作为父节点。
4.重复2,3的步骤直到集合为空。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值