哈夫曼编码应用
问题描述
给定字符串,将每个不同的字符的哈夫曼编码表示并输出其哈夫曼编码,并再将其哈夫曼编码还原回字符串
分析一下
构建哈夫曼树
使用静态链表,先将所有的结点关系全部清零,再进行结点和相应权值的赋值,遍历后n-1个结点 (新根),从n个结点中选两个最小的权值了合成一棵树,并将新根加入到比较结点中(并将这两棵树标记以及结合,不再进行下次的比较),最后后合成一颗哈夫曼树
哈夫曼编码
在这里用到了一个大数组嵌套一个小数组,大数组I的功能是存放每一个结点的哈夫曼编码,小数组中存放每一个结点的没有个哈夫曼编码的反码
从叶子结点分别向根出发即可,若该结点时双亲结点的左孩子,则记0,反之记为1,记录在一个记录数组中直到该结点没有双亲(根结点),每遍历完一个结点后将记录数组复制到对应的小数组中。并及时清空记录数组进行下次使用。
在输出方面使用了多重的for循环,依次遍字符串,将字符串的每一个字符与结点进行比较,若相等则输出对应的(该结点)的哈夫曼编码,最后再用一数组接收,以便后续的使用
解码
依次遍历没有过哈夫曼遍历,从根结点出发,遇0向左,遇1则右,若到了叶子(无左孩子或无右孩子),则输出。并将更新结点值
看看代码吧
必没问题!!!(有问题就用个dev吧...)
[code]#include#define Max_S 1000000 #define MaxSize 100using namespace std;//静态链表 typedef struct TreeNode{ char data; int weight; int parent,lchild,rchild; }HTNode, *HuffmanTree; //编码数组 typedef struct{ int HC[MaxSize];}info,*Info;//一个大数组套一个小数组 //===========================================================//一些串和二叉树的算法 //求串长 int Strstrlen(char a[]){ int i = 1; for(;a !='\0';){ i++; } return i;} //字符串赋值 void StrAssige(char(&S)[MaxSize+1],char a[]){ S[0] = Strstrlen(a); for(int i = 1;i = HT.weight){//次小的 min = HT.weight; s2 = i; } } } //若最小值相等,则浅(先遍历的)树的序号在前 int S1 = qiushendu(HT,s1); int S2 = qiushendu(HT,s2); if(S1 >= S2){ int temp; temp = s1; s1 = s2; s2 = temp;//交换顺序 } //用数组存放最小值和次小值 int a[3] = {0,s1,s2}; return a;}//===========================================================================//构建哈夫曼树 void CreatHuffmanTree(HuffmanTree &HT,char *huf,int *wei,int n){ int s1,s2;//最小值与极小值 if(n |