堆
- 优先队列 :取出元素的顺序是依照元素的优先权大小, 而不是元素进入队列的先后顺序
- 特性:
- 结构性:用数组表示的完全二叉树;
- 有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
- 最大堆 的创建
typedef struct HeapStruct *MaxHeap;
struct HeapStruct {
ElementType *Elements;
int Size;
int Capacity;
}
MaxHeap Create(int MaxSize)
{
MaxHeap H= Malloc(sizeof(struct heapStruct));
H->Elements = malloc((MaxSize +1) *sizeof(ElementType));
H->Size = 0 ;
H->Capacity = MaxSize;
H->Elements[0] = MaxData;
return H;
}
void Insert(MaxHeap H,ElementType item)
{
int i;
if(IsFull(H)){
printf("最大堆已满");
return;
}
i =++->Size;
for(;H->Elements[i/2]<item;i/=2){
H->Elements[i] = H->Elements[i/2];
H->Elements[i] = item;
}
}
- 最大堆的建立
- 建立最大的堆:将已经存在的N个元素按最大堆的要求存放在一个一维数组中
- 方法1 :通过插入操作, 将N个元素一个个相继插入到一个初始为空的堆中去, 其时间代价最大为O(NlogN);
- 方法2:在线性时间复杂度下建立最大堆.
(1)将N个元素按顺入顺序存入, 先满足完全二叉树的结构特性
(2)调整各结点位置, 以满足最大堆的有序特性;
哈夫曼树
- 特点:
(1)没有度为1的结点;
(2)n个叶子结点的哈夫曼树共有2n-1个结点;
(3)哈夫曼树的任意非叶节点的左右树交换后仍然是哈夫曼树;