#include<iostream> #include<string.h> using namespace std; typedef struct{ int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; void Select(HuffmanTree HT,int len,int &s1,int &s2){ int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f; for(i=1;i<=len;i++){ if(HT[i].weight<min1&&HT[i].parent==0){ min1=HT[i].weight; s1=i; } } int temp=HT[s1].weight; HT[s1].weight=0x3f3f3f3f; for(i=1;i<=len;i++){ if(HT[i].weight<min2&&HT[i].parent==0){ min2=HT[i].weight; s2=i; } } HT[s1].weight=temp; } //構造赫夫曼樹 void CreatHuffmanTree(HuffmanTree &HT,int n){ int m,s1,s2,i; if(n<=1) return; m=2*n-1; HT=new HTNode[m+1]; for(i=1;i<=m;++i){ HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } cout<<"葉子結點權值:"; for(i=1;i<=n;++i) cin>>HT[i].weight; for(i=n+1;i<=m;++i){ Select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2 ; HT[i].weight=HT[s1].weight+HT[s2].weight; } } typedef char **HuffmanCode; //赫夫曼編碼 void CreatHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n){ int i,start,c,f; HC=new char*[n+1]; char *cd=new char[n]; cd[n-1]='\0'; for(i=1;i<=n;++i){ start=n-1; c=i; f=HT[i].parent; while(f!=0){ --start; if(HT[f].lchild==c) cd[start]='0'; else cd[start]='1'; c=f; f=HT[f].parent; } HC[i]=new char[n-start]; strcpy(HC[i], &cd[start]); } delete cd; } void show(HuffmanTree HT,HuffmanCode HC,int n){ for(int i=1;i<=n;i++) cout<<HT[i].weight<<"赫夫曼編碼爲:"<<HC[i]<<endl; } int main(){ HuffmanTree HT; int n; cout<<"葉子結點個數:"; cin>>n; CreatHuffmanTree(HT,n); HuffmanCode HC; CreatHuffmanCode(HT,HC,n); show(HT,HC,n); }