struct HaffNode { int weight; int parent; int lchild; int rchild; }; struct HaffCode { int start; int weight; int bit[100]; }; void hoffman(int w[],int n,HaffNode ht[],HaffCode hc[]) { int m1,m2,x1,x2;//m1 m2为最小次小值 x1 x2表示当前分支结点的左右儿子 for(int i=0;i<2*n-1;i++)//ht赋值 { if(i<n) ht[i].weight=w[i]; else ht[i].weight=0; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } for(int i=0;i<n-1;i++) { m1=m2=maxNumber; x1=x2=0; for(int j=0;j<n+i;j++) { if (ht[j].weight<m1&&ht[j].parent==0) { m2=m1; x2=x1; m1=ht[j].weight; x1=j; } else if (ht[j].weight<m2&&ht[j].parent==0) { m2=ht[j].weight; x2=j; } } ht[x1].parent=n+i; ht[x2].parent=n+i; ht[n+i].weight=ht[x1].weight+ht[x2].weight; ht[n+i].lchild=x1; ht[n+i].rchild=x2; } HaffCode cd; int chlid,parent; for(int i=0;i<n;i++) { cd.start=n-1; cd.weight=ht[i].weight; chlid=i; parent=ht[chlid].parent; while(parent!=0) { if(ht[parent].lchild==chlid) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; chlid=parent; parent=ht[chlid].parent; } for(int j=cd.start+1;j<n;j++) { hc[i].bit[j]=cd.bit[j]; } hc[i].start=cd.start; hc[i].weight=cd.weight; } } int main() { int w[]={4,2,6,8,3,2,1,9,7,11,33}; int n=11; HaffCode *hc=new HaffCode[n]; HaffNode *ht=new HaffNode[2*n-1]; hoffman(w,n,ht,hc); for(int i=0;i<n;i++) { cout<<"weight="<<hc[i].weight<<" code="; for(int j=hc[i].start+1;j<n;j++) cout<<hc[i].bit[j]; cout<<endl; } return 0; }