• 哈夫曼树的构建和编码实现


    数据结构(第二版) 严蔚敏

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define inf 9999999
    int n,m;
    typedef char **huffmancode;
    typedef struct
    {
        int weigth;
        int parent, lchild, rchild;
    }htnode, *huffmantree;
    
    void Select(huffmantree &ht,int s,int &s1,int &s2)
    {
        s1=s2=0;
        int min1,min2;
        min1=min2=inf;
        for(int j=1;j<=s;j++) 
        if(ht[j].parent==0)  
        {
            if(ht[j].weigth<=min1)
            {
            min2=min1;
            min1=ht[j].weigth;
             s2=s1;s1=j;
            }
            else if(ht[j].weigth<=min2)
            {
                min2=ht[j].weigth;
                s2=j;
            }
        }      
    }
    
    void createhuffmantree(huffmantree &ht, int n)
    {
        if (n <= 1) return;
         m = 2 * n - 1;
        ht = new htnode[m + 1];
        for (int i = 1; i <= m; ++i)
        {
            ht[i].parent = 0; ht[i].lchild = 0; ht[i].rchild = 0;
        }
        for (int i = 1; i <= n; i++) cin >> ht[i].weigth;
        for (int i = n + 1; i <= m; i++)
        {
            int s1,s2;
            Select(ht,i-1,s1,s2);
            ht[s1].parent = i; ht[s2].parent = i;
            ht[i].lchild = s1; ht[i].rchild = s2;
            ht[i].weigth = ht[s1].weigth+ ht[s2].weigth;
        }
    }
    
    void createhuffmancode(huffmantree &ht,huffmancode &hc,int n)
    {
        hc=new char*[n+1];
        char *cd=new char[n];
        for(int i=1;i<=n;i++)
        {
            int start=n-1,c=i,f=ht[i].parent;
            while(f!=0)
            {
                --start;
                if(ht[f].lchild==c) cd[start]='0';
                else cd[start]='l';
                c=f;f=ht[f].parent;
            }
            hc[i]=new char[n-start];strcpy(hc[i],&cd[start]);
        }delete cd;
    }
    
    int main()
    { 
        cout<<"请输入叶子结点数目(n>1):"<<endl;
        cin>>n;
        cout<<"请输入权值"<<endl; 
        huffmantree ht;
        huffmancode hc;
        createhuffmantree(ht,n); 
        for(int i=1;i<=m;i++)
        {
            cout<<ht[i].weigth<<' ';
        }
        cout<<endl; 
        createhuffmancode(ht,hc,n);
        for(int i=1;i<=n;i++)
        {
            cout<<ht[i].weigth<<' '<<hc[i]<<endl;
        }
        delete ht; 
    }
  • 相关阅读:
    【狼】狼的unity3d脚本学习
    [转]关于Unity中文件读取
    【狼】unity3d 安卓播放视频替代视频纹理
    SpringMVC异常处理
    springboot 热启动
    旅游网dao层
    MyBatisPlus快速入门
    旅游网dao层
    MySQL8 修改密码验证插件
    Zookeeper环境搭建
  • 原文地址:https://www.cnblogs.com/siuh/p/8976637.html
Copyright © 2020-2023  润新知