堆是一棵完全二叉树,最小元素在根结点上,任意子树也是一个堆。对于堆中的任意一个位置i上的元素,其左儿子在2i位置上,右儿子在2i+1位置上,它的父节点在 2/i 位置上。
堆的插入:
为了保持堆为完全二叉树,在堆的最后一个位置创建空结点,如果空结点的父节点大于要插入的结点,就将父节点移入空结点中,依此类推,直到要插入的结点能放入移空的位置中。
堆的删除(删除根结点,也就是最小的元素):
将根结点两个子结点中较小者提至根结点,再将那个较小的子节点的两个子节点的较小者提升,依此类推,直到将最后一个结点移入最近移空的结点中。
注:为了方便实现,堆的第一个元素是从1开始的,而非从0开始。
Heap.h
#include "Utility.h"
#define MinData (-32767)
struct HeapStruct
{
int Capacity;
int Size;
int *Elements;
};
typedef struct HeapStruct *PriorityQueue;
PriorityQueue Initialize( int MaxElements)
{
PriorityQueue H;
H = (HeapStruct *)malloc(sizeof(HeapStruct));
if( H == NULL )
cout << "空间不足!" << endl;
H->Elements = (int *)malloc( (MaxElements + 1) * sizeof(int) );
if( H->Elem