赫夫曼树
- 建立赫夫曼树
- 建立赫夫曼编码表
- 将电文转化为赫夫曼编码
代码很凌乱,仅供抄作业使用 :)
#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");
}