二叉树的一个典型应用-哈夫曼树

原创 2013年12月04日 14:12:39

作者:徐老师,华清远见嵌入式学院讲师。

哈夫曼树是二叉树的一个典型应用,利用哈夫曼树,我们可以形成哈夫曼编码,进而实现对数据的压缩与解压处理。

哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树。

当中的几个概念我们不得不说一下:

(1)路劲(Path):从树中的一个结点到另一个结点之间的分支构成两个结点间的路径。

(2)路径长度(Path Length):路径上的分支树。

(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。

(4)结点的权(Weight of Node):在一些应用中,赋予树中结点的一个有实际意义的树。

(5)结点的带权路径长度(Weight Path Length of Node):从该结点到树的根结点的路径长度与该结点的权的乘积。

(6)树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和

在下图所示的四棵二叉树,都有4个叶子结点,其权值分别1、2、3、4,他们的带权路径长度分别为:

(a)WPL = 1 x 2 + 2 x 2 + 3 x 2 + 4 X 2 = 20

(b)WPL = 1 x 1 + 2 x 2 + 3 x 3 + 4 x 3 = 28

(c)WPL = 1 x 3 + 2 x 3 + 3 x 2 + 4 x 1 = 19

(d)WPL = 2 x 1 + 1 x 2 + 3 x 3 + 4 x 3 = 29

其中,(c)图所示的二叉树的带权路径长度最小,这棵树就是哈夫曼树。可以验证,哈夫曼树的带权路径长度最小。

那么我们应该如何构建一个哈夫曼树呢?其实并不复杂:

1)首先构建一个叶子节点集合,这里我用链表来表示,每个节点在插入到链表中时是按照权值由小到大顺序插入的。

2)首先判断当前集合节点的个数是否大于1,如果不大于,则程序结束,集合里的节点即为创建好的哈夫曼树的根节点,如果大于1,则转至3

3)取出集合中前两个节点(取出后集合中已经删除掉这两个节点),由这两个节点构建一颗新树,新树的权值为这两个节点之和。权值较小的节点为新树的左孩子,较大的节点为新树的右孩子。

4)将新树按权值由小到大的顺序插入到集合中,转至2。

实现代码如下:

mytypes.h

bitree.h

bitree.c

linklist.h

linklist.c

main.c

makefile:

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column773.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>


树之哈夫曼树(最优二叉树)

本文来介绍哈夫曼树。
  • u013275340
  • u013275340
  • 2014年08月22日 17:22
  • 1088

算法设计学习:二叉树算法

题目:表达式(a-(b+c))*(d/e)存储在erchas
  • banbanlin
  • banbanlin
  • 2014年08月03日 16:40
  • 524

二叉树分析及设计

自己设计一颗二叉树,实现
  • u012910363
  • u012910363
  • 2014年07月27日 08:40
  • 353

关于哈夫曼树的一些总结--(总是要和完全二叉树和满二叉树搞混了 = =)

哈夫曼树: 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结...
  • HL_liang
  • HL_liang
  • 2014年12月30日 16:47
  • 2838

哈夫曼树(最优二叉树)的创建

哈夫曼树是带权路径最小的一种特殊二叉树,所以也称最优二叉树。 在这里不讨论基本概念如如何计算路径等,而只着重于树的创建,具体过程让我们举例而言。其基本的原理为:将所有节点一开始都视为森林,每次从森林...
  • Ava1anche
  • Ava1anche
  • 2015年07月23日 17:16
  • 1423

Java实战应用视频教程之Java算法分析与设计

实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划、HashTable算法) 适合人群:中级 课时数量:38课时 用到技术:Java算法 涉及项目:案例应用实战 咨询qq:...
  • xiarilove
  • xiarilove
  • 2015年02月09日 17:03
  • 1321

二叉树的应用举例-哈夫曼树及哈夫曼编码

1.哈夫曼树:哈夫曼树也成为最优二叉树,在实际应用中有广泛的应用。      叶子节点的权值:叶子节点的权值是对叶子节点赋予的一个有意义的数量值。     设二叉树有n个带权值的叶子节点,从根节点...
  • zh23862691
  • zh23862691
  • 2013年10月01日 14:45
  • 1751

二叉树的应用--哈夫曼树

哈夫曼树,最优二叉树。
  • u014634338
  • u014634338
  • 2014年09月27日 22:30
  • 444

二叉树和哈夫曼树

二叉树:#include #include #include #include #include #include #include using namespace std; t...
  • mlp750303040
  • mlp750303040
  • 2017年05月11日 22:54
  • 127

哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/...
  • basycia
  • basycia
  • 2016年07月24日 20:02
  • 2277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的一个典型应用-哈夫曼树
举报原因:
原因补充:

(最多只允许输入30个字)