路径长度:从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径是的分支数目称做路径长度。
哈夫曼树的概述:
给树的结点赋予某种树值,称此数值为结点的权。
从根结点到该结点之间的路径长度与该结点的权的乘积称为带权路径长度(Weighted Path Lenght,WPL)。
树中所有叶子结点的带权路径长度之和称为该树的带权路径长度,
记为:
在n0个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树为哈夫曼树(Huffman tree)又称最右二叉树。
哈夫曼树的特征:
1、完全二叉树不一定是哈夫曼树
2、在哈夫曼树中,权值大的离根结点近
3、哈夫曼树不唯一,但带权路径长度WPL一定相等
构造哈夫曼树的算法如下:
(1) 根据给定的权值(W1,W2...Wn),构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点,其左、右子树均为空;
(2)在森林F中选取两棵根结点权值最小的树作为左、右子树构造一棵新二叉树,并且置新二叉树根结点权值为左、右子树上根结点的权值之和(根结点的权值=左右孩子权值之和,叶结点的权值= Wi)
(3)在森林F中,删除这两棵二叉树,同时将新二叉树加入到F中;
(4)重复(2)、(3)直到森林F中只含一棵二叉树为止,这棵二叉树就是Huffman树。
下图是权值W=(1,3,5,7)来构造一颗哈夫曼树的过程,图d就是一颗哈夫曼树,它的带权路径长度WPL = (1+3)x3+5x2+7x1 = 29
哈夫曼编码 /最小冗余码
我们所熟知的ASCLL码是定长码,而哈夫曼编码是不定长编码
哈夫曼编码的实质就是使用频率越高的字符采用越短的编码。(最短编码)
构造哈夫曼编码的算法如下:
哈夫曼编码特点:
1、任一编码不可能是其它编码的前缀
2、哈夫曼树没有度为1的结点,若哈夫曼树有n个叶子结点,则树有2n-1个结点。
3、Huffman编码时从叶子到根(从下到上);译码时又要从根结点到叶子(从上到下),因此每个结点都需要增加双亲指针分量。