实现哈夫曼树编码的算法可分为两大部分:
(1)构造哈夫曼树;
(2)在哈夫曼树上求叶结点的编码;
哈夫曼树构造算法:
(1)由给定的n个权值构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={T1,T2,,...,TN}
(2)在F中选取根结点的权值最小和次小的两棵二叉树作为左,右子树构造一棵新的二叉树,这棵二叉树根结点的权值为其左右子树权值之和
(3)在集合F中删除作为左右子树的两棵二叉树,并将新建立的二叉树加入到集合F中
(4)重复(2)(3)直到F中只剩下最后一棵所需的二叉树,就是哈夫曼树
在哈夫曼树上求叶结点的编码算法:
在已建立的哈夫曼树中,从叶结点开始,沿结点的双亲链回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼的值
规定哈夫曼树中的左分支代表0,右分支代表1
举例:
A:5 B:29 C:7 D:8 E:14 F:23 G:3 H:11
哈夫曼树:
哈夫曼树的存储:
weight parent Lchild Rchild
5 | 8 | -1 | -1 |
29 | 13 | -1 | -1 |
7 | 9 | -1 | -1 |
8 | 9 | -1 | -1 |
14 | 11 | -1 | -1 |
23 | 12 | -1 | -1 |
3 | 8 | -1 | -1 |
11 | 10 | -1 | -1 |
8 | 10 | 0 | 6 |
15 | 11 | 2 | 3 |
19 | 12 | 7 | 8 |
29 | 13 | 4 | 9 |
42 | <