已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8、11,试填写出其对应赫夫曼树HT存储结构的初态和终态,并利用权值构造一颗哈夫曼树(约定左孩子权值小于右子树权值),并对其进行哈夫曼编码,并计算WPH。
时间: 2023-07-04 20:10:20 浏览: 160
哈夫曼树的建立(根据输入的权值,建立一棵哈夫曼树)
初态:
```
struct HTNode {
int weight;
int parent, lchild, rchild;
};
HTNode HT[MAXSIZE];
int n = 7; // 总共有7个字符
// 初始化每个节点的权值和父节点、孩子节点
for (int i = 1; i <= n; i++) {
HT[i].weight = ...; // 根据题目给定的权值填入
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
```
终态:
```
45
/ \
27 18
/ \ / \
12 15 7 11
/ \ \
3 9 8
```
构造哈夫曼树:
1. 将所有节点按照权值从小到大排序。
2. 选取两个权值最小的节点作为新节点的左右孩子,并将新节点的权值设为左右孩子权值之和,将新节点插入到有序表中,并删除原来的两个节点。
3. 重复 2 直到有序表中只剩下一个节点,此节点即为哈夫曼树的根节点。
按照上述算法,可以得到下面的哈夫曼树:
```
45
/ \
15 30
/ \ / \
7 8 12 18
/ \
3 4
```
对哈夫曼树进行编码:
1. 将每个叶子节点的编码初始化为空。
2. 从根节点开始,向左走记为 0,向右走记为 1,将路径上的编码逐渐累加到每个叶子节点上。
按照上述算法,可以得到下面的哈夫曼编码:
```
A: 110
B: 10
C: 111
D: 00
E: 010
F: 01
G: 011
```
计算WPH:
WPH(Weighted Path Length)即为所有叶子节点的权值乘以其编码长度之和,可以用以下公式计算:
$$WPH = \sum_{i=1}^n w_i \times len_i$$
其中 $w_i$ 为第 $i$ 个叶子节点的权值,$len_i$ 为第 $i$ 个叶子节点的编码长度。
按照上述公式,可以得到:
$$WPH = 3 \times 3 + 12 \times 2 + 7 \times 3 + 4 \times 2 + 2 \times 3 + 8 \times 2 + 11 \times 3 = 122$$
因此,这颗哈夫曼树的WPH为122。
阅读全文