1、定义
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
2、几个概念
路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定
根结点的层数为1,则从根结点到第L层结点的路径长
度为L-1。
结点的权及带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。
3、构建过程
假设有1 3 4 5 6 8 11 13 几个数,如何构建Huffman tree呢,
第一步,选取最小的2个数组成一颗数,并把2个数在原森林中删除,把2数之和加入森林,那么树变为:
森林变为:4 4 5 6 8 11 13
第二步,重复第一步,森林变为:5 6 8 8 11 13,树变为:
第三步,重复第一步,森林变为:8 8 11 11 13,树变为:
第四步,重复第一步,森林变为:11 11 13 16,数变为:
第五步,重复第一步,森林变为:13 16 22,树变为:
第六步,重复第一步,森林变为:22 29,树变为:
第七步,森林中只有2个数了,连起来,整个Huffman Tree就构造完成,整棵树为:
4、Huffman码:
按照上面的Huffman树,我们可以得到各个节点的编码如下:
1 的编码为:00000
3 的编码为:00001
4 的编码为:0001
5 的编码为:100
6 的编码为:101
8 的编码为:001
11 的编码为:11
13 的编码为:01