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

原创 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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用递归思想解决二叉树的实际应用

递归的思想在于他将一件n的事情变成n-1的事情,反复如此即可得到一件关于1的事情,所以递归的关键有两点:1.当这件事为1的时候我们的具体操作;2.什么样的事情做n次与做n-1次是一样的。看下面的例子:...

二叉树算法应用案例

笔者在1月4号将在CSDN学院开设一门公开课《算法与游戏实战》,在这里先把课程内容透露一部分给读者。首先讲述二叉树算法,二叉树在IT领域应用是非常广泛的,它不仅在游戏开发中,在当前比较火的人工智能上也...

二叉树基础及应用

二叉树基础: 刚看到堆排序,顺便记录一下关于树的一些基本概念: 前言 前面介绍的栈、队列都是线性结构(linear structure)。而树是非线性结构(non-linear structu...

二叉树的好处(应用)

二叉排序树是一种比较有用的折衷方案。     数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。     链表与之相反,删除和插入元素很快,但查找很慢。     二叉排序树就...

[C++]二叉树应用--Huffman code

二叉树应用–Huffman code 赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树。 背景知识首先我们先讨论何为Huffman code。Max-Path ...

二叉树简单应用

在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),接下来我就在这里给大家介绍一下二叉树在算法中的简...

二叉树及其应用--二叉树的应用

二叉树带节点数输出 给出二叉树的先序遍历输出(空结点用’.’)表示,请构造二叉树,并输出二叉树的广义表表示,此广义表中每个结点均带有一个整数,这个整数表示对应的子树上结点总数。输入说明: 一行仅由...

二叉树的应用详解 - 数据结构

概述: 平衡树——特点:所有结点左右子树深度差≤1 排序树——特点:所有结点“左小右大 字典树——由字符串构成的二叉排序树 判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重) 带权树—...
  • hguisu
  • hguisu
  • 2012-06-25 11:45
  • 21893

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

哈夫曼树,最优二叉树。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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