数据结构之哈夫曼树(最优二叉树)

来源:互联网 发布:男士睡衣品牌 知乎 编辑:程序博客网 时间:2024/05/21 01:58

文本压缩是一种非常重要的技术,自然涉及到了压缩编码。哈夫曼编码——一种最基本的压缩编码方法

几个术语:

1、路径:树中两个节点之间的分支序列

2、路径长度:路径上的分支数目

3、树的路径长度:从树根到每个节点的路径长度之和。在节点数目相同的二叉树中,完全二叉树的路径长度最短

4、节点的权:在一些应用中,赋予树中节点的 一个有某种意义的实数

5、节点的带权路径长度:从该节点到树根之间的路径长度与该节点的权的乘积

6、 树的带权路径长度:树中所有叶子节点的带权路径长度之和

7、最优二叉树:带权路径长度最小的二叉树

二叉树的带权路径长度(WPL)=∑Wk*Lk 其中,Wk为第k个叶子节点的权值;Lk为第k个叶子节点到根节点的路径长度。

举个例子

这里写图片描述

图中c事实上就是最优二叉树,即哈夫曼树

哈夫曼树的建立

哈夫曼树的特点是权值越大的叶子节点越靠近根节点,而权值越小的叶子节点越远离根节点。

基本思想:
1、根据给出的n个权值{w1 ,w2 , w3 ,……… , wn},构成n棵二叉树的集合F={T1, T2,T3,…….. ,Tn},其中每颗二叉树T1中只有一个带权为W1的根节点,其左右字数均为空。
2、在集合F中选取根节点的权值最小和次最小的两颗树作为左、右子树构造一颗新的二叉树,这颗新的二叉树的根节点的权值为其左、右子树根节点的权值之和

3、在集合F中删除作为左、右子树的两颗二叉树,并将新建立的二叉树加入集合F中。
4、重复2、3两步,当集合F中只剩下一颗二叉树时,这颗二叉树便是所要建立的哈夫曼树。

举个例子

有A B C D E五个叶子节点且权值集合为W={2,3,4,3,3}的一颗哈夫曼树的构造过程
如下图所示

这里写图片描述

注意:

1、选取两颗根节点权值最小的二叉树,当有权值相同的情况时,可以在相同权值的二叉树中任选一颗

2、两颗根节点最小的二叉树组成新的二叉树的左、右子树时,谁左谁右没有规定。

3、哈夫曼树中,权值越大的叶子节点离根越近,这也是WPL最小哦啊的实际根据和哈夫曼树的应用依据

4、哈夫曼树中没有度为1的节点,二叉树的相关性质对哈夫曼树也实用。如根据二叉树的性质n0=n2+1,可推出有n个叶子结点的哈夫曼树共有2n-1个节点