声明:leftheap.h文件
typedef int ElementType;
#ifndef _LeftHeap_H
#define _LeftHeap_H
struct TreeNode;
typedef struct TreeNode* PriorityQueue;
PriorityQueue Initialize(void);
ElementType FindMin(PriorityQueue H);
int IsEmpty(PriorityQueue H);
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2);
#define Insert( X, H ) ( H = Insert1( (X), H))
PriorityQueue Insert1(ElementType X, PriorityQueue H);
PriorityQueue DeleteMin(PriorityQueue H);
#endif
源代码:
#include "leftheap.h"
#include <stdio.h>
#include <stdlib.h>
struct TreeNode
{
ElementType Element;
PriorityQueue Left;
PriorityQueue Right;
int Npl;
};
PriorityQueue Initialize(void)
{
return NULL;
}
int IsEmpty(PriorityQueue H)
{
return H == NULL;
}
ElementType FindMin(PriorityQueue H)
{
if (IsEmpty(H))
{
printf("Priority queue is empty!\n");
return -1;
}
return H->Element;
}
void SwapChildren(PriorityQueue H)
{
PriorityQueue tmp;
tmp = H->Left;
H->Left = H->Right;
H->Right = tmp;
}
//合并操作实际例程
static PriorityQueue Merge1(PriorityQueue H1, PriorityQueue H2)
{
if (H1->Left == NULL) //因为是左式堆,若左儿子为null,那么右儿子必然也为null
{
H1->Left = H2;
}
else //H1是根值较小的堆,故递归合并它的右子树与H2;
{
H1->Right = Merge(H1->Right, H2);
if (H1->Left->Npl < H1->Right->Npl)
{
SwapChildren(H1);
}
H1->Npl = H1->Right->Npl + 1;
}
return H1;
}
//合并操作驱动例程
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2)
{
if (H1 == NULL)
{
return H2;
}
if (H2 == NULL)
{
return H1;
}
if (H1->Element < H2->Element)
{
return Merge1(H1, H2);
}
else
{
return Merge1(H2, H1);
}
}
//插入操作
PriorityQueue Insert1(ElementType X, PriorityQueue H)
{
PriorityQueue SingleNode;
SingleNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
if (SingleNode == NULL) {
printf("Out of space!");
}
else
{
SingleNode->Element = X;
SingleNode->Npl = 0;
SingleNode->Left = SingleNode->Right = NULL;
H = Merge(SingleNode, H);
}
return H;
}
//删除操作
PriorityQueue DeleteMin(PriorityQueue H)
{
PriorityQueue LeftHeap, RightHeap;
if (IsEmpty(H))
{
printf("Priority queue is empty!");
return H;
}
LeftHeap = H->Left;
RightHeap = H->Right;
free(H);
return Merge(LeftHeap, RightHeap);
}