堆的定义
存储结构:堆中元素在数组中是按照完全二叉树层序存储的。数组起始结点为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的步骤直到集合为空。