哈夫曼树哈夫曼编码

哈夫曼树哈夫曼编码

 

输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。

输入格式:

第一行输入叶子结点个数,接着依次输入权值。

输出格式:

输出哈夫曼编码,输出带权路径长度。

输入样例:

在这里给出一组输入。例如:

8
5 29 7 8 14 23 3 11
 
结尾无空行
 
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int all_weight;
typedef struct
{
    int weight;
    int parent,lchird,rchild;
}HTNode,*HuffmanTree;
void InitHuffmanTree(HuffmanTree &H,int n)
{
    if(n<=1) return ;
    int m=2*n-1;
    H=new HTNode[m+1];
    for (int i = 1; i <= m; i++)
    {
        H[i].parent=0;
        H[i].lchird=0;
        H[i].rchild=0;
    }
    for (int i = 1; i <= n; i++)
    {
        cin>>H[i].weight;
    }
}

bool cmp(HTNode a,HTNode b)
{
    return a.weight<b.weight;
}
void Select(HuffmanTree H,int l,int &s1,int &s2)
{
    HuffmanTree M;
    M=new HTNode[l+1];
    for (int i = 1; i <= l; i++)
    {
        M[i].weight=H[i].weight;
        M[i].parent=H[i].parent;
        M[i].lchird=H[i].lchird;
        M[i].rchild=H[i].rchild;
    }
    sort(M+1,M+l+1,cmp);
    int a[2]={0};
    int num=0;
    for (int i = 1; i <= l; i++)
    {
        if(M[i].parent==0)
        {
            for (int j = 1; j <= l; j++)
            {
                if(M[i].weight==H[j].weight&&H[j].parent==0&&j!=a[0])
                {
                    a[num++]=j;
                    break;
                }
            }
        }
        if(num==2) break;
    }
    s1=a[0];
    s2=a[1];
    delete M;
}
typedef char** HuffmanCode;
void CreateHuffmanTree(HuffmanTree &H,int n)
{
    int m=2*n-1;
    int s1,s2;
    for (int i = n+1; i <= m; i++)
    {
        Select(H,i-1,s1,s2);
        H[s1].parent=i; H[s2].parent=i;
        H[i].lchird=s1; H[i].rchild=s2;
        H[i].weight=H[s1].weight+H[s2].weight;
        all_weight=all_weight+H[i].weight;
    }
}
void CreateHuffmanCode(HuffmanTree H,HuffmanCode &HC,int n)
{
    HC=new char*[n+1];
    char* cd=new char[n];
    cd[n-1]='\0';
    for (int i = 1; i <= n; i++)
    {
        int start=n-1;
        int c=i;
        int f=H[i].parent;
        while (f!=0)
        {
            --start;
            if (H[f].lchird==c)
            {
                cd[start]='0';
            }
            else cd[start]='1';
            c=f;
            f=H[f].parent;
        }
        HC[i]=new char[n-start];
        strcpy(HC[i],&cd[start]);
    }
    delete cd;
}
int main()
{
    HuffmanTree H;
    HuffmanCode HC;
    int n;
    cin>>n;
    if(n==0||n==1||n==2){
        cout<<"error";
    return 0;
    }
    InitHuffmanTree(H,n);
    CreateHuffmanTree(H,n);
    CreateHuffmanCode(H,HC,n);
    for (int i = 1; i <= n; i++)
    {
        cout<<H[i].weight<<"编码为";
        cout<<HC[i]<<endl;
    }
    cout<<"WPL:"<<all_weight;
    return 0;
}

 

 

posted @ 2021-12-07 23:51  kuaiquxie  阅读(128)  评论(0编辑  收藏  举报