所选题目:哈夫曼树的应用 题目描述:要传输一则报文内容如下: “AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF” 请为这段报文设计哈夫曼编码,要求如下:
1) 请计算出每个字符出现的概率,并以概率为权重来构造哈夫曼树,写出构造过程、画出 最终的哈夫曼树,得到每个字符的哈夫曼编码。
①计算每个字符出现的概率
由报文内容分析知 共有A:15个 B:9个 C:8个 D:12个 E:10个 F:5个 共计59个字符 故每个字符出现的概率如下
A:15/59 B:9/59 C:8/59 D:12/59 E:10/59 F:5/59
②构造哈夫曼树
<第一步>选择权重最小的两个编码 分别是F:5/59 和 C:8/59 并计算其权重的和为 13/59 并将新生成的结点记为M1。
<第二步>再次选择权重最小的两个编码 分别是B:9/59 和 E:10/59 并计算其权重的和为 19/59 并将新生成的结点记为M2。
<第三步>再次选择权重最小的两个编码 分别是D:12/59 和 M1:13/59 并计算其权重的和为 25/59 并将新生成的结点记为M3。
<第四步>再次选择权重最小的两个编码 分别是A:15/59 和 M2:19/59 并计算其权重的和为 34/59 并将新生成的结点记为M4。
<第五步>再次选择权重最小的两个编码 分别是M3:25/59 和 M4:34/59 并计算其权重的和为 1 并将新生成的结点记为M5 是该哈夫曼树的根节点。
③求哈夫曼编码
由图可知
A的哈夫曼编码:10
B的哈夫曼编码:110
C的哈夫曼编码:011
D的哈夫曼编码:00
E的哈夫曼编码:111
F的哈夫曼编码:010
2) 请将上述设计哈夫曼编码的过程,用代码来实现,并输出各个字母的哈夫曼编码。(有 代码,有运行结果的截图)
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 9999999
using namespace std;
//201831061127 黄震 数据结构大作业
//定义Huffman Tree的结构体
struct Huffman
{
int weight=0;//结点的权重
char node='\0';//当前结点的字符
string HuffmanCode="";//Huffman编码
Huffman *lchild;//左孩子
Huffman *rchild;//右孩子
Huffman *parents;//父亲结点
};
void GetHuffmanCode(Huffman *root);//读取Huffman编码的函数
Huffman *GetWeight(Huffman *root,Huffman *lchild,Huffman *rchild);//给每个节点赋权值的函数
int main()
{
int i,treenode;
int eyeson[200];//记录每次循环的中间量的标记数组
memset(eyeson,0,sizeof(eyeson));//初始化
Huffman *root;
char code[100];
Huffman node[51];
cout<<"SWPU 201830161127 黄震 数据结构大作业 代码实现部分"<<endl;
cout<<endl;
cout<<"请输入 需要转化为Huffman编码的序列"<<endl;
cin>>code;
for(i=0;i<51;i++)
node[i].lchild=node[i].rchild=node[i].parents=NULL;//将所有结点初始化为NULL
for(i=0;i<strlen(code);i+&