目录
一.哈夫曼树相关基本概念
(1)路径:指从一个结点到另一个结点之间的分支序列。
(2)路径长度:指从一个结点到另一个结点所经过的分支数目。
(3)结点的权:给树的每个结点赋予一个具有某种实际意义的实数,我们称该实数为这个结点的权。
(4)带权路径长度:在树形结构中,我们把从树根到某一结点的路径长度与该结点的权的乘积,叫做该结点的带权路径长度。
(5)树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为:
其中n为叶子结点的个数, 为第i个叶子结点的权值, 为第i个叶子结点的路径长度。
二.哈夫曼树的构造
1.简单认识哈夫曼
哈夫曼(Huffman)树又称作最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树。如下图所示
图一:WPL=9*2+4*2+5*2+2*2=40
图二:WPL=9*1+5*2+4*3+2*3=37
图三:WPL=4x1+2x2+5x3+9x3=50
PS:定义中,一般根节点一层路径长度为0。
很明显,WPL最小的即为哈夫曼树的最优解,不难理解权值越大的结点离根结点越近的二叉树是最优二叉树(这里其实就用到了贪心算法:构造哈夫曼树时优先选择权值小的结点开始)
2.构造哈夫曼
举个栗子:一组权值结点:2 3 32 19 2 1 6 7 10
①把权值按大小进行排序:1 2 3 6 7 10 19 32
②选最小的两个权值结点,并算出他们的和
③选出与5接近的,小于5放左边,大于5放右边,并计算出和
④再选出7和10,作为新的并列结点,并算出11和17的和(如果两个数的和(11)正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和(11)比较大,不是下一步的两个最小数的其中一个,那么就并列生长。 )
⑤再选19.21并计算和,再选32,并计算和
⑥计算最终结果,即为哈夫曼树
三.哈夫曼树的特点
(1)不存在度为1的结点
(2)n个叶子结点的哈夫曼树有2n-1个结点
(3)对于同一组权值,可以有多个不同结构的哈夫曼树,但他们的WPL一定相同
(4)哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树
四.有关哈夫曼树的应用
哈夫曼编码
- 哈夫曼编码是一种压缩编码的编码算法,是基于哈夫曼树的一种编码方式。哈夫曼树又称为带权路径长度最短的二叉树。
- 举个栗子:
- 上面有个现成的哈夫曼树
那么编码就是左子树上的为0,右子树上的为1,再自根结点扫描下来到叶子结点,输出的值就为哈夫曼编码。比如:规定2为a,则a的哈夫曼编码为:10000;规定10为b,则b的哈夫曼编码为1011。可以看出,哈夫曼编码并不难,核心在于构造哈夫曼树。
----ssss¥