Huffman Tree 簡單構造
阿新 • • 發佈:2018-11-19
//函式:構造Huffman樹HT[2*n-1] #define MAXVALUE 9999//假設權值不超過9999 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 using namespace std; #include <iostream> //Using cin or cout #include <malloc.h> //Using malloc and realloc #include <stdio.h> //Using c #include <stdlib.h> typedef struct { int weight;//權值 int parent;//父結點下標 int lchild;//左孩子下標 int rchild;//右孩子下標 }HTNode; void HuffmanTree(HTNode HT[], int n) { int i,j,x1,x2; int m1,m2; for(i=1;i<=n-1;++i)//n-1個非葉子結點 { m1=m2=MAXVALUE; x1=x2=0; //m1,m2用來記錄結點中最小的權值,x1,x2用來記錄其左右子樹結點 for(j=1;j<n+i;++j) { if(HT[j].parent==0) { if (HT[j].weight<m1) {m2=m1; x2=x1;m1=HT[j].weight; x1=j;} else if(HT[j].weight<m2) { 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; }//外層for迴圈結束 } //函式:求Huffman樹HT[n]的Huffman編碼 #define MAXBIT 20 typedef struct { int bit[MAXBIT]; int start; }HCodeType; void HuffmanCode (HTNode HT[], int n, HCodeType HuffCode[]) { HCodeType cd; int i,j,c,p; for(i=1;i<=n;++i) { cd.start=n; c=i; p=HT[c].parent;//p為c雙親 while(p!=0) { if(HT[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HT[c].parent ;//保持p為c雙親 } for(j=cd.start+1;j<=n;j++) HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } for(i=1;i<=n;++i) { cout<<"第"<<i<<"個字元的哈夫曼編碼為:"; for(int j=HuffCode[i].start+1;j<=n;j++) { cout<<HuffCode[i].bit[j]; //printf("%d",HuffCode[i].bit[j]); } cout<<endl; } } int main() { int n=8; HTNode HT[MAXNODE]; for(int i=1; i<=2*n-1; ++i) //初始化 { HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(int i=1;i<=n;++i) { cout<<"請輸入第"<<i<<"個值為:"<<endl; scanf("%d",&HT[i].weight); if(HT[i].weight>=MAXVALUE) { printf("超過權值允許的最大值,重新輸入!\n"); --i; } } HuffmanTree(HT,n); HCodeType HuffCode[MAXNODE]; HuffmanCode (HT,n,HuffCode); }