用c语言编程:求先序遍历为13,6,3,3,7,3,1,2,4的哈夫曼树的编码和译码
时间: 2024-05-03 19:17:34 浏览: 95
先要构建哈夫曼树,步骤如下:
1. 将所有节点按照权值从小到大排序
2. 选出两个权值最小的节点作为左右子节点构成一个新节点,其权值为左右子节点权值之和
3. 将新节点插入到节点集合中,删除原来的两个节点
4. 重复以上步骤,直到只剩下一个节点,即为哈夫曼树的根节点
根据先序遍历为13,6,3,3,7,3,1,2,4,可以构建如下的哈夫曼树:
```
40
/ \
16 24
/ \ / \
6 3 10 14
/ \ / \ / \ / \
3 3 1 2 4 5 5 9
```
接下来进行编码和译码:
编码:
1. 从根节点开始遍历哈夫曼树,向左走为0,向右走为1
2. 将每个叶子节点的路径上的0和1记录下来,即为该叶子节点的哈夫曼编码
叶子节点的哈夫曼编码为:
```
3: 000
3: 001
1: 0100
2: 0101
4: 011
5: 100
5: 101
9: 110
7: 111
```
译码:
1. 从根节点开始遍历哈夫曼树,遇到0向左,遇到1向右,直到遇到叶子节点
2. 每次遇到叶子节点时,输出该叶子节点对应的字符,并从根节点重新开始遍历哈夫曼树
例如,编码为“0110001101100”对应的译码如下:
```
0 -> 左子节点
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
0 -> 左子节点
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
叶子节点为4,输出4
从根节点重新开始遍历哈夫曼树
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
0 -> 左子节点
叶子节点为3,输出3
从根节点重新开始遍历哈夫曼树
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
1 -> 右子节点
0 -> 左子节点
叶子节点为2,输出2
从根节点重新开始遍历哈夫曼树
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
1 -> 右子节点
1 -> 右子节点
1 -> 右子节点
叶子节点为7,输出7
从根节点重新开始遍历哈夫曼树
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
1 -> 右子节点
0 -> 左子节点
叶子节点为3,输出3
从根节点重新开始遍历哈夫曼树
1 -> 右子节点
1 -> 右子节点
0 -> 左子节点
0 -> 左子节点
1 -> 右子节点
0 -> 左子节点
叶子节点为2,输出2
```
阅读全文