左式堆的建立及其基本操作

左式堆较最小堆而言,可以合并两个左式堆。


#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值