哈夫曼编码和解码(c++实现)

发布时间 2023-11-22 21:01:47作者: 小菜碟子

给一篇英文文章(text),统计各字符出现(仅需包括英文大小写字母)次数。
1) 输出每个字符出现的次数,并进行Huffman树构造,将每个字符的编码存入到文件code1.txt。
2) 输出字符串”Data Structure”的编码。
3) 将英文文章前4段的Huffman编码保存到文件code2.txt。
4) 实现解码功能, 对文章的前2段进行解码。

 1 //哈夫曼树
 2 void HufCode()
 3 {
 4     //52个叶结点+1个最大结点(便于找最小值)
 5     HTNode HT[104];
 6 
 7     //初始化结点
 8     initHT(HT);
 9 
10     //创建哈夫曼树
11     for (int i = 53; i < 2 * 52; i++)
12     {
13         int s1 = 0;
14         int s2 = 0;
15         //在1-i-1区间里面找两个parent=0等权值最小的s1,s2
16         select_two_small(HT, i - 1, s1, s2);
17 
18         //建树
19         HT[s1].parent = HT[s2].parent = i;
20         HT[i].lchild = s1;
21         HT[i].rchild = s2;
22         HT[i].weight = HT[s1].weight + HT[s2].weight;
23     }
24 
25     //从叶节点到根节点获取
26     char temp[53]={0};
27     //分配临时空间存储编码
28     for (int i = 1; i <= 52; i++)
29     {
30         int start = 0;
31         //一个孩子c和一个父亲f,一直往上遍历
32         for (int c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
33         {
34             if (HT[f].lchild == c)
35                 temp[start++] = '1';
36             else if (HT[f].rchild == c)
37                 temp[start++] = '0';
38         }
39         temp[start++] = '\0';
40         reverseS(temp,start);//翻转才是要的编码
41         strcpys(i, temp,start);
42     }
43 }

这些就行了