[数据结构] 赫夫曼树

赫夫曼树

  • 建立赫夫曼树
  • 建立赫夫曼编码表
  • 将电文转化为赫夫曼编码

代码很凌乱,仅供抄作业使用 :)

#include<iostream>
#include<string>
using namespace std;
typedef struct
{
    int weight;
    int parent,lchild,rchild;
}HTNode;
typedef HTNode * HuffmanTree;
typedef struct //临时
{
    int NewWeight;
    int p;
}TempNode,*TempTree;
typedef struct 
{
    string s;
    string charname;
    int pos;
}point;
void InitHuffmanTree(HuffmanTree&HT,int m)
{
    int i;
    HT=new HTNode[m];
    for(i=0;i<m;i++)
    {
        HT[i].weight=0;
        HT[i].parent=-1;
        HT[i].lchild=-1;
        HT[i].rchild=-1;
    }
}//InitHuffmanTree
void SelectMin(HuffmanTree &HT,int n,int &min1,int &min2)
{
    TempTree TT=new TempNode[n];
    int i,j;
    j=0;
    for(i=0;i<n;i++)
    {
        if(HT[i].parent==-1&& HT[i].weight!=0)
        {
            TT[j].NewWeight=HT[i].weight;
            TT[j].p=i;
            j++;
        }
    }
    int m1,m2;
    m1=m2=0;
    for(i=0;i<j;i++)
    {
        if(TT[i].NewWeight<TT[m1].NewWeight)
            m1=i;
    }
    for(i=0;i<j;i++)
    {
        if(m1==m2)
            m2++;
        if(TT[i].NewWeight<=TT[m2].NewWeight&& i!=m1)
            m2=i;
    }
    min1=TT[m1].p;
    min2=TT[m2].p;
}//SelectMin
void CreateHaffmanTree(HuffmanTree&HT,int n,point* p)
{
    int i;
    int m;
    int min1,min2;
    if(n<=1)
    {cerr<<"ParameterError!"<<endl;}
    m=2*n-1;//哈夫曼树中结点的个数
    InitHuffmanTree(HT,m);
    cout<<"输入对应权值"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>HT[i].weight;
        p[i].pos=HT[i].weight;
    }

    for(i=n;i<m;i++)
    {
        SelectMin(HT,i,min1,min2);
        HT[min1].parent=i;
        HT[min2].parent=i;
        HT[i].lchild=min1;
        HT[i].rchild=min2;
        HT[i].weight=HT[min1].weight+HT[min2].weight;
        printf("lchild\trchild\tparent\n");
        printf("%d\t%d\t%d\n",HT[min1].weight,HT[min2].weight,HT[i].weight);

    }
    cout<<"HaffmanTree Complete"<<endl;
}// CreateHaffmanTree
void HuffmanCoding(point* p,HuffmanTree HT,int i,string str,int n)
{
    //p为编码表,HT为数,i为当前访问序号,str为累加编码,n为数的个数
    if(HT[i].lchild==-1&&HT[i].rchild==-1)
    p[i].s=str;
    else
    {
        str=str+"0";
        HuffmanCoding(p,HT,HT[i].lchild,str,n);
        str=str.substr(0,str.length()-1); //str=str-"0"
        str=str+"1";
        HuffmanCoding(p,HT,HT[i].rchild,str,n);
        str=str.substr(0,str.length()-1); //str=str-"1"

    }//else

}//HuffmanCoding
void Coding(point* p,int n)
{
    cout<<"赫夫曼编码表"<<endl;
    for(int i=0;i<n;i++)
        cout<<p[i].charname<<" "<<p[i].s<<endl;
    cout<<"输入字符串进行编码"<<endl;
    string str;cin>>str;int times=0;int i=0;
    while(str.length()!=0)
    {
        if(times>=n)
        {cerr<<"ERROR"<<endl;break;}
        if(str.find(p[times].charname)==0)
            {
                str=str.substr(p[times].charname.length(),str.length());
                cout<<p[times].s;
                times=0;
        }
        else
            times++;
    }//for

}//Coding
int main()  
{  
    int i;  
    cout<<"输入字符个数:"<<endl;  
    cin>>i;
    point* p=new point[i];
    cout<<"输入字符"<<endl;
    for(int j=0;j<i;j++)
        cin>>p[j].charname;
    HuffmanTree HT;  
    CreateHaffmanTree(HT,i,p); 
    string str="";int j=2*i-2;

        HuffmanCoding(p,HT,j,str,i);
    Coding(p,i);
    delete []p;
    cout<<'\n'<<"----END----"<<endl;
    system("pause");
}  

赫夫曼树输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值