哈夫曼树,是二叉树的一种很主要的应用。
一、哈夫曼树的定义
1.带权路径长度wpl
设二叉树具有n个带权值的叶结点,那么从根结点到各个叶结点的路径长度与相应结点权值的乘积的和,叫做带权路径长度wpl(weighted path length)
W
P
L
=
∑
i
=
1
n
w
i
l
i
WPL = \sum_{i=1}^{n}w_il_i
WPL=i=1∑nwili
1.相同的叶子结点,可以构造出不同的哈夫曼树。
2.权值越大的叶结点,越接近根,整个哈夫曼树的wpl就会越小。
2.哈夫曼树
我们把具有最小带权路径长度的二叉树称为 哈夫曼树(也称为最优树)
二、构造哈夫曼树。
1.构造原则:
- (1)权值越大的叶结点约靠近根结点。
- (2)权值约小的叶子结点,越远离根结点。
2.构造过程
- 给定的n个权值{ w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn}构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={ T 1 , T 2 , . . . , T 3 {T_1,T_2,...,T_3} T1,T2,...,T3}.
- 在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这颗新的二叉树根结点的权值为其左、右子树根结点权值之和。
- 在集合中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中。
动画模拟参考:https://www.bilibili.com/video/BV1hK4y1k7Wr
上图 的wpl 可以用加和公式,也可以用所有非叶子结点的和。求出。
3.有 n 0 n_0 n0个叶子结点,会有多少个结点。
哈夫曼树,没有度为1 的结点。
根据 n = n 0 + n 1 + n 2 ; n 0 = n 2 + 1 ( 二 叉 树 性 质 ) ; = > n = 2 n 0 − 1 n= n_0+n_1+n2; n_0=n_2+1(二叉树性质);=> n = 2n_0-1 n=n0+n1+n2;n0=n2+1(二叉树性质);=>n=2n0−1
三、哈夫曼编码
规定哈夫曼树中的做分支为0,右分支为1,则从根节点到每个叶结点所经过的分支对应的0和1组成的序列便是该结点对应字符的编码。这样的编码称为哈夫曼编码。
- 不等长编码:出现频率高的,编码短;频率低的编码长,大大降低总编码长度。
- 前缀码:在一组字符的哈夫曼编码中,不可能出现一个字符的哈夫曼编码是另一个字符哈夫曼编码的前缀。