已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8、11,试填写出其对应赫夫曼树HT存储结构的初态和终态,并利用权值构造一颗哈夫曼树(约定左孩子权值小于右子树权值),并对其进行赫夫曼编码,并计算WPH。
时间: 2023-07-04 19:09:39 浏览: 107
哈夫曼树的建立(根据输入的权值,建立一棵哈夫曼树)
初态和终态的存储结构如下:
```
typedef struct {
int weight; // 权值
int lchild, rchild, parent; // 左右孩子节点和父节点的下标
} HTNode, *HuffmanTree;
HuffmanTree HT; // 存储空间
int n; // 叶子节点数目
```
哈夫曼树的构造过程:
首先将所有节点按照权值从小到大排序,然后取出权值最小的两个节点,将它们合并成一个节点,权值为它们的和,同时把它们作为新节点的左右子树。将新节点插入到原来的节点集合中,再次进行排序,重复上述过程,直到只剩下一个节点为止。
具体的构造过程如下:
1. 所有节点按照权值从小到大排序:
```
E(2) F(8) D(4) A(3) C(7) G(11) B(12)
```
2. 取出权值最小的两个节点 E 和 F,合并成一个新节点,权值为 2+8=10,作为新节点的左右子树:
```
10
/ \
E F
```
3. 将新节点插入到原来的节点集合中,继续排序:
```
D(4) A(3) C(7) G(11) B(12) 10(EF)
```
4. 取出权值最小的两个节点 D 和 A,合并成一个新节点,权值为 4+3=7,作为新节点的左右子树:
```
10
/ \
7(DA) F
/ \
D A
```
5. 继续排序,重复上述过程:
```
C(7) G(11) B(12) 10(EF) 7(DA)
```
6. 合并 C 和 G,权值为 7+11=18,继续构造:
```
10
/ \
7(DA) F
/ \
D A
18
/ \
10(EF) 7(DA)
/ \
D A
```
7. 合并 B 和新节点,权值为 12+18=30:
```
18
/ \
10(EF) 7(DA)
/ \
D A
30
/ \
18 B
/ \
10(EF) 7(DA)
/ \
D A
```
最终得到的哈夫曼树如下:
```
30
/ \
18 B
/ \
10(EF) 7(DA)
/ \
D A
```
对该哈夫曼树进行编码,可以得到:
```
E: 0
F: 1 1
D: 1 0 0
A: 1 0 1
C: 1 1 0
G: 1 1 1
B: 0
```
WPH = 2*3 + 2*12 + 3*7 + 3*4 + 3*2 + 2*8 = 98
阅读全文