赫夫曼树

来源:互联网 发布:微拍堂用软件加粉丝 编辑:程序博客网 时间:2024/05/17 08:19
//赫夫曼编码//改进在HT中查找两个最小值的算法//充分利用C++特性重新优化代码//测试权值:  5 29 7 8 14 23 3 11#include<iostream>#include<iomanip>  //格式化输出using namespace std;struct HTNODE{int weight;  //权值int parent,lchild,rchild;};void AcceptWeight(int *&weiArr,int &size);void SelectTwoSmall(HTNODE HT[],int &S1,int &S2,int i);void CreateHufTree(HTNODE HT[],int w[],int size);void AnalyHufCoding(HTNODE HT[],int size);int main(void){int size,*weiArr;AcceptWeight(weiArr,size);   //从键盘接收权值HTNODE *HT=new HTNODE [2*size]; //存储赫夫曼树cout<<"\n建立好的赫夫曼树为 : \n";CreateHufTree(HT,weiArr,size);  //建立赫夫曼树cout<<"\n\n解析出来的赫夫曼编码为 : \n";AnalyHufCoding(HT,size);delete [2*size] HT;return 0;}void AcceptWeight(int *&weiArr,int &size){cout<<"请输入权值的个数(>1) : ";while(1){cin>>size;if(size>1) break; //检测权值个数是否合法}weiArr=new int [size];cout<<"请依次输入"<<size<<"个权值(整型) : \n";for(int i=0;i<size;i++)cin>>weiArr[i];}//从当前权值中选取两个没有双亲而且最小的权值//而且S1记录的为最小,S2记录的为次小void SelectTwoSmall(HTNODE HT[],int &S1,int &S2,int i){int j;for(j=1;j<i;j++)//选取第一个没有双亲的权值if(HT[j].parent==0){S1=j; break;}for(;j<i;j++)//选取第一个没有双亲的权值并且不重复if(j!=S1 && HT[j].parent==0){S2=j; break;}for(int j=1;j<i;j++)if(HT[j].parent==0 &&   HT[j].weight<HT[S1].weight){if(j==S2) continue;S1=j;}for(int j=1;j<i;j++)if(HT[j].parent==0 &&   HT[j].weight<HT[S2].weight){if(j==S1) continue;S2=j;}if(HT[S1].weight>HT[S2].weight){int t=S1;S1=S2;S2=t;}   //保证S1为最小}//根据权值建立赫夫曼树void CreateHufTree(HTNODE HT[],int weiArr[],int size){int twosize=2*size,i;for(i=1;i<=size;i++){HT[i].weight=weiArr[i-1];HT[i].parent=0;HT[i].rchild=0;HT[i].lchild=0;}for(;i<twosize;i++){HT[i].weight=0;HT[i].parent=0;HT[i].rchild=0;HT[i].lchild=0;}int S1,S2;for(i=size+1;i<twosize;i++){SelectTwoSmall(HT,S1,S2,i);HT[i].lchild=S1;HT[i].rchild=S2;HT[i].weight=HT[S1].weight+HT[S2].weight;HT[S1].parent=i;HT[S2].parent=i;}for(i=1;i<twosize;i++)cout<<HT[i].weight<<' ';}//根据赫夫曼树逆向求出赫夫曼编码void AnalyHufCoding(HTNODE HT[],int size){char *temp;temp=new char [size];int end;temp[size-1]='\0';for(int i=1;i<=size;++i){for(int j=0;j<size-1;j++)temp[j]=' ';end=size-1;cout<<setw(3)<<HT[i].weight<<" : ";for(int c=i,f=HT[c].parent ; f!=0; c=f,f=HT[f].parent){if(HT[f].lchild==c)temp[--end]='0';elsetemp[--end]='1';}cout<<temp<<endl;}delete [size] temp;}

0 0
原创粉丝点击