二叉堆
堆是一种特殊的队列,能够使用优先级实现更改队列顺序。用完全二叉树实现这样的结构。
说是二叉树,其实并没有建立这样一个结构,堆的空间甚至是一个数组。
对于数组中的任一位置i上的元素,其儿子在2i位置上,右儿子在左儿子后的单元(2i + 1)中,它的父亲在[i / 2]上。
用这样的数学关系可以将一个二叉树抽象到一个数组中。
struct HeapStruct
typedef sytuct HeapStruct *PriorityQueue;
struct HeapStruct
{
int Capacity;
int Size;
int *num;
};
PriorityQueue IniTalize(int MaxElement)
{
PriorityQueue H;
H = malloc(sizeof(struct HeapStruct));
if(H == NULL)
{
printf("Out of Space\n");
exit(EXIT_FAILURE);
}
H->num = malloc((MaxElement + 1) * sizeof(MaxElement));
if(H->num == NULL)
{
printf("Out of Space\n");
exit(EXIT_FAILURE);
}
H->Capacity = MaxElement;
H->Size = 0;
H->num[0] = MinData; //根据将要储存的数据的特征选取的一个小值
//方便元素插入根节点的时候停止循环
return 0;
}
void Insert(int X, PriorityQueue H)
{
int i;
if (IsFull(H))
{
printf("priority queue is full\n");
exit(EXIT_FAILURE);
}
if (i = ++H->Size, H->num[i / 2] > X; i /= 2)
{
H->num[i] = H->num[i / 2];
}
H->num[i] = X;
}
int DeleteMin(PriorityQueue H)
{
int i, Child;
int MinElement, LastElement;
if(IsEmpty(H))
{
printf("Priority queue is Empty\n");
exit(EXIT_FAILURE);
}
MinElement = H->num[1];
LastElement = H->num[H->Size--];
for (i = 1; i * 2 <= H->Size; i = Child)
{
Child = i * 2;
if (Child != H->Size && H->num[Child + 1] < H->num[Child]; Child++)
{
Child++;
}
if(LastElement > H->num[Child])
{
H->num[i] = H->num[Child];
}
else
{
break;
}
}
H->num[i] = LastElement;
return MinElement;
}
int IsFull(PriorityQueue H)
{
return H->Size<Capacity?0:1;
}
int IsEmpty(PriorityQueue H)
{
return H->Size>0?0:1;
}