数据结构之树(七)——哈夫曼树及哈夫曼编码

哈夫曼树

从树中一个结点到另一个结点之间的分支构成俩个结点之间的路径,路径上的分支数目称做路径长度。
树的路径长度就是从树根到每一结点的路径长度之和。
假设有n个权值{w1,w2,...,wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权wk,每个叶子的路径长度为lk,我们通常记作,则其中带权路径长度WPL最小的二叉树称做哈夫曼树。也叫做最优二叉树。
哈夫曼树的哈夫曼算法描述:
1.根据给定的n个权值{w1,w2,....,wn}构成n棵二叉树的集合F={T1,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi根结点,其左右子树均为空。
2.在F中选取俩棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
3.在F中删除这俩棵树,同时将新得到的二叉树加入F中。
4.重复2和3步骤,直到F只含一颗树为之。这棵树便是哈夫曼树。
例如序列A5,E10,B15,D30,C40,字母后面的数字表示权值。构建哈夫曼树过程如图:
数据结构之树(七)——哈夫曼树及哈夫曼编码数据结构之树(七)——哈夫曼树及哈夫曼编码数据结构之树(七)——哈夫曼树及哈夫曼编码数据结构之树(七)——哈夫曼树及哈夫曼编码

哈夫曼编码

一般地,设需要编码的字符集为{d1,d2,...,dn},各个字符在电文中出现的次数或频率集合为{w1,w2,...,wn},以d1,d2,...,dn作为叶子结点,以w1,w2,...,wn作为相应叶子结点的权值来构造一棵哈夫曼树。规定哈夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就是哈夫曼编码。
若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称做前缀编码。

如六个字母的频率为A 27,B 8,C 15,D 15,E 30,F 5
如图为构造哈夫曼树的过程的权值显示:
数据结构之树(七)——哈夫曼树及哈夫曼编码
然后将权值左分支改为0,右分支改为1后的哈夫曼树,如图所示:
数据结构之树(七)——哈夫曼树及哈夫曼编码
然后对六个字母用其从树根到叶子所经过路径的0或1来编码,可以得到如图的哈夫曼编码:
数据结构之树(七)——哈夫曼树及哈夫曼编码