哈夫曼(Huffman)树,又称为最优二叉树,是带权路径长度(wpl)最短的二叉树。
一般我们要做的事分为三步:
- 构建哈夫曼树
- 求WPL值
- 求哈夫曼编码
构造哈夫曼树
- 将所有左,右子树都为空的作为根节点。
- 在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
- 从森林中删除这两棵树,同时把新树加入到森林中。
- 重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。
下面是构建哈夫曼树的图解过程:
WPL值的求法
事实上wpl有两种求法
- 将哈夫曼树的所有分支节点的权值相加就是我们要求的wpl值
- 将哈夫曼树中的所有叶子节点的权值于路径长度的乘积相加也是我们要求的wpl值
例如上图的wpl值就是48
哈夫曼编码
用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子节点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子节点对应的字符编码,即是哈夫曼编码。
就拿上图例子来说:
A,B,C,D对应的哈夫曼编码分别为:111,10,110,0
用图说明如下:
代码实现
1 |
|