zoukankan      html  css  js  c++  java
  • 哈夫曼树的构建和编码实现

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

    #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; 
    }
  • 相关阅读:
    每日日报2020.12.1
    每日日报2020.11.30
    981. Time Based Key-Value Store
    1146. Snapshot Array
    565. Array Nesting
    79. Word Search
    43. Multiply Strings
    Largest value of the expression
    1014. Best Sightseeing Pair
    562. Longest Line of Consecutive One in Matrix
  • 原文地址:https://www.cnblogs.com/siuh/p/8976637.html
Copyright © 2011-2022 走看看