文章中部分内容和思路来自《大话数据结构》
准备知识
路径长度:从树中一个节点到另一个节点之间的分支构成两个节点之间的路径,路径上的分支数目称作路径长度。例如图6-12-4(a)中从根节点到D节点的路径长度为4
树的路径长度:从根节点到每个节点的路径长度之和。例如图6-12-4(a)中树的路径长度为1+1+2+2+3+3+4+4=20
带权路径长度:从树中一个节点到根节点之间的路径长度与节点上权的乘积
树的带权路径长度:树的带权路径长度为树中每个节点的带权路径长度之和
哈弗曼树定义
带权路径长度WPL最小的二叉树叫做哈弗曼树,也叫最优二叉树
哈弗曼树的构造
以带权节点A5、B15、C40、D30、E10为例
Step1:在给出的带权节点中取出最小两个权值的节点,构造成如图6-12-5的树
Step2:在剩下的带权节点中取出最小权值的节点,构造成如图6-12-6的树
Step3:重复Step2,依次构造6-12-7、6-12-8,完成构造
哈夫曼编码定义
一般地,设需要编码的字符集为{d1, d2, d3 ... dn},各个字符在电文中出现的次数或频率集合为{w1, w2, w3 ... wn},以d1, d2, d3 ... dn作为相应的叶子节点,以w1, w2, w3 ... wn作为相应叶子节点的权值来构造一棵哈弗曼树。规定哈弗曼树的左分支代表0,右分支代表1,则从根节点到叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,这就是哈夫曼编码
哈夫曼编码案例
将"BADCADFEED"内容以二进制方式传输,假设各字符使用频率分别为A 27, B 8, C 15, D15, E 30, F 5
采用传统二进制编码方式:
编码结构为001000011010000011101100100011(30个字符)
采用哈夫曼编码方式:
编码结构为1001010010101001000111100(25个字符)[ps:编解码需要遵循相同的哈夫曼树]
代码实现见后续文章《哈夫曼编码c++/qt实现》:http://blog.youkuaiyun.com/superyang_/article/details/79281404
====================================================================
博主有自己的个人主页啦!请求关注,请求支持。QAQ.