#include <iostream> #include <string> using namespace std; const int N = 6; //字符个数 const int C = 2*N-1; //HT树节点个数 const int Min = 1000; //最小值 typedef struct { char ch; //权值对应的字符 string hc;//HT编码 int weight; //权值 int parent; //双亲位置 int Lchild; //左孩子位置 int Rchild; //右孩子位置 }HT; void select(HT ht[],int a,int *min1,int *min2) { int i,c1,c2; c1 = Min; c2 = Min; for(i=0;i<=a;i++) { if ( (ht[i].parent==0) && (ht[i].weight<c1) ) { *min1 = i; c1 = ht[i].weight; } } for(i=0;i<=a;i++) { if ((ht[i].parent==0) && (*min1!=i) && (ht[i].weight<c2) ) { *min2 = i; c2 = ht[i].weight; } } } void CrtHuffmantree(HT ht[],int w[],char elem[],int n) { int i,m,min1,min2; m = 2*n-1; for(i=0;i<n;i++) { ht[i].ch = elem[i]; ht[i].hc = ""; ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i=n;i<m;i++) { ht[i].ch = '/0'; ht[i].hc = ""; ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } //初始化完毕 for(i=n;i<m;i++)//建树 { select(ht,i-1,&min1,&min2); //返回最小值和次小值的位置 ht[i].weight = ht[min1].weight + ht[min2].weight; ht[min1].parent=i; ht[min2].parent=i; ht[i].Lchild=min1; ht[i].Rchild=min2; } } void CrtHuffmancode(HT ht[], int n) //编码 { int c,p; for(int i=0;i<n;i++) { c = i; p = ht[i].parent; while(p != 0) { if(ht[p].Lchild == c) ht[i].hc += "0"; else ht[i].hc += "1"; c = p; p = ht[p].parent; } } } void OutputHuffmancode(HT ht[],int n) { cout << "字符/t频率/t编码" << endl; for (int i=0;i<n;i++) { cout << ht[i].ch << "/t" << ht[i].weight << "/t"; for (int j=ht[i].hc.length();j>0;j--) //倒序输出编码 cout << ht[i].hc[j-1]; cout << endl; } } void main() { char elem[N] = {'a','b','c','d','e','f'}; //使用的是书上例子的数据 int w[N] = {45,13,12,16,9,5}; HT hufftree[C]; CrtHuffmantree(hufftree,w,elem,N); CrtHuffmancode(hufftree,N); OutputHuffmancode(hufftree,N); }