赫夫曼树:
1、先把有权值的叶子节点按照从小到大的顺序排成一个有序序列,即:A(5),E(10),B(15),D(30),C(40)。
2、取前两个权值最小的结点即A(5)和E(10),作为一个新的结点N1的两个子节点,结点权值较小的作为左结点,即A为左结点,E为右结点,N1的权值为两个结点权值的和,即5+10=15。
3、将N1替换A和E,放到原序列里,重新排序,即:N1(15),B(15),D(30),C(40)。重复步骤2,取出N1(15),B(15),组成新的结点N2,N2权值为30。
4、将N2替换N1和B插入到序列里,即N2(30),D(30),C(40),重复步骤2,取出N2(30),D(30),组成新的结点N3,N3权值为60。
5、剩下N3(60)和C(40),将他俩组成新的结点T,C为左结点,N3为右结点。生成赫夫曼树如下图所示:
赫夫曼编码:
假设6个字母频率为A 27,B 8,C 15,D 15,E 30,F 5,合起来正好是100%,将他们排成赫夫曼树如下所示:
将权值左分支改为0,右分支改为1,如下图所示:
此时,我们对六个字母用其从跟到叶子结点所经过的路径的0和1来编码,可以得到如下:
A:01
B:1001
C:101
D:00
E:11
F:1000
双方约定好赫夫曼树后,也可以根据赫夫曼编码来解码,等到源码。