最小堆构造哈夫曼树

#include<iostream>
using namespace std;
#define Max 60
    typedef struct TreeNode
        {
            int weight;
            TreeNode *left;
            TreeNode *right;
        }*HuffmanTree,HuffmanNode;


    typedef struct HeapStruct
        {
            HuffmanTree *data;
            int Size;// 当前的节点个数
            int Capacity;// 数组的最大容量
        }*MinHeap,minheap; //最小堆

    void printlist(HuffmanTree L);  //线序遍历哈夫曼树
    void init_HeapStruct(MinHeap &L); //初始化最小堆
    bool empty_MinHeap(MinHeap &L); //判断最小堆是否为空
    HuffmanTree get_newNode(); //返回一个新创建的节点
    void creat_init_MinHeap(MinHeap &L); //创造初始化一个最小堆
    void insert_data(MinHeap &L,HuffmanTree e);//将e 插进这个最小堆
    HuffmanTree delete_data(MinHeap &L); //删除其中最小的权值,也就是堆顶,并返回
    void Readjusting_Node(MinHeap &L,int parent); //调整一个节点
    void Creat_MinHeap(MinHeap &L);// 创造一个最小堆
    HuffmanTree Creat_HuffmanTree(MinHeap &L) ;//用最小堆创造一个哈夫曼树 并返回根节点
    void printlist(HuffmanTree L); //线序遍历哈夫曼树

        int main()
            {
                MinHeap L;
                init_HeapStruct(L);
                creat_init_MinHeap(L);
                cout<<"你想创建几个元素的最小堆"<<endl;
                int num;
                cin>>num;
                for(int i=1;i<=num;i++)
                {
                    L->data[i]->left=NULL;
                    L->data[i]->right=NULL;
                    L->data[i]->weight=i;
                }
               L->Size=num;
               Creat_MinHeap(L); //创建一个最小堆
               HuffmanTree p=Creat_HuffmanTree(L);
               printlist(p);

            }


    void init_HeapStruct(MinHeap &L)  //初始化最小堆 //
        {
            L=NULL;
        }

    bool full_MinHeap(MinHeap &L) //判断最小堆是否是满的
        {
            if(L->Size==L->Capacity)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    bool empty_MinHeap(MinHeap &L) //判断最小堆是否为空
        {
            if(L->Size==0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    HuffmanTree get_newNode() //返回一个新创建的节点
        {
            HuffmanTree L=new HuffmanNode;
            L->left=L->right=NULL;
            L->weight=0;
            return L;
        }


    void creat_init_MinHeap(MinHeap &L) //创造初始化一个最小堆
        {
            if(L==NULL)
                {
                    L=new minheap;
                    L->data=new HuffmanTree[Max+1];
                    for(int i=0;i<=Max;i++)
                    {
                        L->data[i]=new HuffmanNode;

                    }
                    L->data[0]->weight=-1000; //定义一个哨兵元素
                    L->data[0]->left=L->data[0]->right=NULL;
                    L->Capacity=Max;
                    L->Size=0;
                }
            else
                {
                    cout<<"已经分配空间了呦"<<endl;
                }

        }

    void insert_data(MinHeap &L,HuffmanTree e)//将e 插进这个最小堆

       {
           int i=L->Size+1; //i指向要插入的位置
           int temp=e->weight;
           while(L->data[i/2]->weight>temp)
           {
               L->data[i]=L->data[i/2];
               i=i/2;
           }

           L->data[i]=e;
           L->Size++;
       }

   HuffmanTree delete_data(MinHeap &L) //删除其中最小的权值,也就是堆顶,并返回
        {
            if(L==NULL)
                {

                    return NULL;
                }
            else if(empty_MinHeap(L)==true)
                {
                    return NULL;
                }
                else
                 {
                    HuffmanTree Min_data=L->data[1]; //将堆顶元素保存下来
                    HuffmanTree temp=L->data[L->Size]; //将最后一个元素保存下来
                    L->Size--;
                    int parent=1;
                    int Min_Child;
                    while(2*parent<=L->Size) //有左子树时就进行循环
                    {
                        Min_Child=2*parent;

                        if(Min_Child!=L->Size) //如果有右子树
                            {
                                if(L->data[Min_Child+1]->weight<L->data[Min_Child]->weight)
                                    {
                                        Min_Child++;
                                    }
                            }

                         if(temp->weight<L->data[Min_Child]->weight)
                             {
                                    break;
                             }

                        else
                            {
                                                                        L->data[parent]=L->data[Min_Child];
                                parent=Min_Child;
                            }
                    }

                    L->data[parent]=temp;

                    return Min_data;
                }

        }


    void Readjusting_Node(MinHeap &L,int parent) //调整一个节点
        {
            int Min_Child;
            HuffmanTree temp=L->data[parent]; //将要调整的节点先保存起来
            while(2*parent<=L->Size) //如果有左子树
            {
                Min_Child=2*parent;
                if(Min_Child!=L->Size)
                {
                    if(L->data[Min_Child]->weight>L->data[Min_Child+1]->weight)
                    {
                        Min_Child++;
                    }
                }
                   if(L->data[Min_Child]->weight<temp->weight)
                       {
                           L->data[parent]=L->data[Min_Child]; //将最小的这个赋给父节点
                           parent=Min_Child;
                       }
                   else
                       {
                           break;
                       }
            }
                L->data[parent]=temp;

        }

    void Creat_MinHeap(MinHeap &L)
        {
            if(L==NULL||L->Size==0)
                {
                    return ;
                }
            else
                {
                    int i=L->Size/2;
                    while(i>=1)
                    {
                        Readjusting_Node(L,i);
                        i--;
                    }
                }

        }

    HuffmanTree Creat_HuffmanTree(MinHeap &L) //用最小堆创造一个哈夫曼树 并返回根节点
        {
            if(L==NULL)
            {
                return NULL;
            }
            int num=L->Size-1;
            while(num>=1)
            {
                HuffmanTree New_Node=get_newNode();
                New_Node->left=delete_data(L);
                New_Node->right=delete_data(L);
                New_Node->weight=New_Node->left->weight+New_Node->right->weight;
                insert_data(L,New_Node);
                num--;
            }
            HuffmanTree p=delete_data(L);  //`
            return p;
        }

    void printlist(HuffmanTree L) //线序遍历哈夫曼树
        {
            if(L!=NULL)
            {
                cout<<L->weight<<" ";
                printlist(L->left);
                printlist(L->right);
            }
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值