左式堆较最小堆而言,可以合并两个左式堆。
#include <stdio.h>
#include<stdlib.h>typedef int ElementType;
struct TreeNode;
typedef struct TreeNode *PriorityQueue;
PriorityQueue Initialize(ElementType X); //初始化X
ElementType FindMin(PriorityQueue H); //查找最小值
int IsEmpty(PriorityQueue H); //判空
PriorityQueue Merge(PriorityQueue H1,PriorityQueue H2); //合并
static PriorityQueue Merge1(PriorityQueue H1,PriorityQueue H2);
#define Insert(X,H) (H = Insert1((X),H));
PriorityQueue Insert1(ElementType X,PriorityQueue H);
#define DeleteMin(H) (H = DeleteMin1(H));
PriorityQueue DeleteMin1(PriorityQueue H); //删除最小值
void SwapChildren(PriorityQueue H); //交换
int main(void)
{
PriorityQueue H;
H = Initialize(99);
Insert(45,H);
Insert(44,H);
Insert(12,H);
Insert(6,H);
DeleteMin(H);
DeleteMin(H);
printf("%d",FindMin(H));
printf("\nHello World!\n");
return 0;
}
struct TreeNode
{
ElementType Element;
PriorityQueue Left;
PriorityQueue Right;
int Npl;
};
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2) //合并1
{
if(NULL == H1)
return H2;
if(NULL == H2)
return H1;
if(H1->Element < H2->Element)
return Merge1(H1,H2);
else
return Merge1(H2,H1);
}
static PriorityQueue Merge1(PriorityQueue H1, PriorityQueue H2) //合并2
{
if(NULL == H1->Left )
H1->Left = H2;
else
{
H1->Right = Merge(H1->Right,H2);
if(H1->Left->Npl < H1->Right->Npl)
SwapChildren(H1);
H1->Npl = H1->Right->Npl + 1;
}
return H1;
}
PriorityQueue Insert1(ElementType X, PriorityQueue H) //插入一个X,实际上就是与一个节点合并
{
PriorityQueue SingleNode;
SingleNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
if(NULL == SingleNode)
printf("Out Of Space\n");
else
{
SingleNode->Element = X;
SingleNode->Npl = 0;
SingleNode->Left = SingleNode->Right = NULL;
H = Merge(SingleNode,H);
}
return H;
}
PriorityQueue DeleteMin1(PriorityQueue H) //删除最小值
{
PriorityQueue LeftHeap,RightHeap;
if(IsEmpty(H))
{
printf("Priority Is Empty\n");
return H;
}
LeftHeap = H->Left;
RightHeap = H->Right;
free(H);
return Merge(LeftHeap,RightHeap);
}
void SwapChildren(PriorityQueue H) //交换左右儿子
{
PriorityQueue P;
P = H->Left;
H->Left = H->Right;
H->Right = P;
}
PriorityQueue Initialize(ElementType X) //初始化X,
{
PriorityQueue H;
H = (struct TreeNode*)malloc(sizeof(struct TreeNode));
H->Left = H->Right = NULL;
H->Element = X;
H->Npl = 0;
return H;
}
ElementType FindMin(PriorityQueue H) //返回最小值,即第一个元素
{
if(IsEmpty(H))
return -1;
else
return H->Element;
}
int IsEmpty(PriorityQueue H) //判空
{
return H == NULL;
}