份电文中有6种字符:A,B,C,D,E,F,它们的出现频率依次为16,5,9,3,30,1,完成问题:(1)设计一棵哈夫曼树;(画出其树结构)(2)计算其带权路径长度WPL;(3)写出其哈夫曼树HT存储结构的初态和终态。
时间: 2023-08-18 19:05:09 浏览: 118
构造哈夫曼树之后,求每一个字符的编码需要走一条从叶子结点到根结点的路径
5星 · 资源好评率100%
好的,我来回答你的问题。
(1) 设计哈夫曼树的方法是:将所有字符的出现频率从小到大排序,每次取出频率最小的两个字符构建一个新节点,其权值为这两个字符的频率之和,然后将新节点插入到已有节点的集合中,重复这个过程,直到所有节点都被合并成了一个根节点。下面是该哈夫曼树的树结构:
```
74
/ \
/ \
/ \
/ \
30 44
/ \ / \
/ \ / \
16 14 9 30
/ \ \
/ \ \
5 11 3
/ \
/ \
1 10
```
(2) 带权路径长度(WPL)是指每个字符的权值乘以它到根节点的路径长度之和,这个哈夫曼树的WPL计算如下:
WPL = 16*2 + 5*4 + 9*3 + 3*4 + 30*1 + 1*5 = 113
(3) 哈夫曼树的存储结构可以用一个结构体数组来表示,每个结构体包含一个字符和它的权值,以及它在哈夫曼树中的左右孩子和父节点的下标。下面是哈夫曼树HT的初态和终态:
初态:
```
struct HTNode{
char ch; //字符
int weight; //权值
int parent; //父节点下标
int lchild; //左孩子下标
int rchild; //右孩子下标
};
HTNode HT[13] = {
{'A', 16, -1, -1, -1},
{'B', 5, -1, -1, -1},
{'C', 9, -1, -1, -1},
{'D', 3, -1, -1, -1},
{'E', 30, -1, -1, -1},
{'F', 1, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1},
{'\0', 0, -1, -1, -1}
};
```
终态:
```
struct HTNode{
char ch; //字符
int weight; //权值
int parent; //父节点下标
int lchild; //左孩子下标
int rchild; //右孩子下标
};
HTNode HT[13] = {
{'A', 16, 4, -1, 0},
{'B', 5, 6, -1, 1},
{'C', 9, 5, -1, 2},
{'D', 3, 7, -1, 3},
{'E', 30, 12, 0, 11},
{'F', 1, 8, -1, 5},
{'\0', 0, 2, 1, 4},
{'\0', 0, 3, 2, 4},
{'\0', 0, 4, 5, 6},
{'\0', 0, 4, 7, 8},
{'\0', 0, 5, 9, 10},
{'\0', 0, 6, -1, 7},
{'\0', 0, -1, 4, -1}
};
```
其中,下标为4的节点是根节点。
阅读全文