快速掌握哈弗曼树
哈弗曼树的基本定义
哈弗曼树又称最优数,是一类带权路径长最短的树。
看看里面涉及的概念:
(1)路径:从树的一个节点到另一个节点之间的分支构成了这两个节点之间的路径
(2)路径长度:路径上的分支数目
(3)树的路径长度:从树根到每一个节点的路径长度之和
(4)权:这个在数学上有相似的定义,可以相似的理解
(5)节点的带权路径长度:树中所有带权路径长度之和
(6)哈弗曼树:假设有n个叶子节点的二叉树,每个叶子节点都有权重,使得带权路径长度WPL最小的二叉树就叫做最优二叉树或哈弗曼树。
单看概念很难看懂,我们就拿一个实在的例子来进行说明:
哈弗曼树的构造算法:
给定叶子结点个数和相应的权重的情况下,如何构造哈弗曼树呢?
我们还是看一个实际的例子吧:注意:哈弗曼树是一种二叉树,由于哈弗曼树中没有度为1的节点,那么,根据n0=n2+1可知,一颗有n个叶子节点的哈弗曼树一共有2n-1个节点,可以存储在大小为2n-1的一维数组中。
哈弗曼编码
什么叫哈夫曼编码呢?
同样的,为了方便理解,我们还是用图来进行说明:
在上面的图中,我们已经找到了一个哈夫曼树,我们只要将树的左子树全部编码为0,右子树全部编码为1(或者相反的方式进行编码,就可以得到每一个叶子节点的哈弗曼编码了)那么有:
A:000
B:001
C:01
D:10
E:11
我们会发现,哈夫曼编码不会出现前缀的现象。