哈夫曼树及其应用

article/2025/8/25 5:26:13

1、哈夫曼树的基本概念 

---- 哈夫曼(Huffman)树又称作最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树。

---- “路径”就是从树中的一个结点到另一个结点之间的分支构成的部分,而分支的数目就是路径长度

---- 树的路径长度:就是从树根到每一结点的路径长度之和。

---- 考虑带权的结点,结点带权路径长度为:从该结点到树根之间的路径长度与结点上权的乘积。

---- 带权路径长度WPL(weighted path length):树中所有叶子结点的带权路径长度之和。

假设一个有n个带权叶子结点的二叉树,其权值为{w1,w2,....wn},每个叶子结点带权wk,每个叶子的路径长度为 lk,则从根结点

到各个叶子结点的路径长度与相应的权值的乘积之和叫做二叉树的带权路径长度,通常记作:

        

如下图所示是由4个叶子结点构成的三棵不同的带权二叉树:

    

三棵二叉树的带权路径长度为:

(a)WPL=9x2+4x2+5x2+2x2=18+8+10+4=40

(b)WPL=9x1+5x2+4x3+2x3=9+10+12+6=37

(c)WPL=4x1+2x2+5x3+9x3=4+4+15+27=50

其中(b)所示的二叉树的WPL最小,此树是哈夫曼树。由上图可知:由n个带权叶子结点所构成的二叉树中,满二叉树或完全二叉树

不一定是最优二叉树。权值越大的结点离根结点越近的二叉树才是最优二叉树。

2、哈夫曼树的构造方法

--1)先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列,即D2,B4,C5,A9.

--2)取头两个最小权值的结点作为一个新结点N的两个孩子结点,最好相对较小的是左孩子,这里D为N的左孩子,B为N的右孩子。

如下图2-1(a)所示,新的结点N的权值为两个叶子结点权值的和2+4=6.

--3)将N1替换D和B,插入有序序列中,保持从小到大排列。即C5,N6,A9.

--4)重复步骤2),将N与C作为一个新结点M的两个孩子结点。如图2-1(b)所示,M的权值=5+6=11.

--5)将M替换C和N,插入有序序列中,为A9,M11.

--6)重复步骤2),将A和M作为一个新结点T的两个孩子结点,由于T是根结点,完成哈夫曼树的构造。

      

这样构造的二叉树才是最优的哈夫曼树,通过刚才的步骤,可以得出构造哈夫曼树的哈夫曼算法描述:

-- 1)根据给定的n个叶子结点的权值{w1,w2,...wn}构成n棵二叉树的集合F={T1,T2,...Tn},其中每棵二叉树Ti中只有一个带权为wi的

根结点,其左右子树均为空。

-- 2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树上根结点

的权值之和。

-- 3)在F中删除这两棵树,同时将新得到的二叉树加入F中。

-- 4)重复步骤2)3),直到F只含一棵树为止。这棵树便是哈夫曼树。

//哈夫曼树的结点类型
typedef struct HTreeNode
{char data[5]; //每个结点是字符类型,最多5个字符int weight; //字符所占的权重int parent; //双亲结点所在下标int left; //左孩子结点所在下标int right; //右孩子结点所在下标
}HTNode;
//哈夫曼树的构造,n个结点,最后生成的树有2n-1个结点
void CreateHTree(HTNode ht[],int n)
{int lchild,rchild;int min1,min2;for(int i = 0;i < 2*n-1;i++){ht[i].parent = ht[i].left = ht[i].right = -1;}for(int j = n;j < 2 * n-1;j++) //前n个结点是已知的叶子结点,构造n之后的结点{min1 = min2 = 32767;lchild = rchild = -1;for(int k = 0;k<j-1;k++){if(ht[k].parent == -1) //只在尚未构造二叉树的结点中查找{if(ht[k].weight<min1){min2 = min1;rchild = lchild;min1 = ht[k].weight;lchild = k;}else if(ht[k].weight<min2){min2 = ht[k].weight;rchild = k;}}}ht[lchild].parent = j;ht[rchild].parent = j;ht[j].weight = ht[lchild].weight + ht[rchild].weight;ht[j].left = lchild;ht[j].right = rchild;}
}
3、哈夫曼编码

---- 哈夫曼编码是哈夫曼树的一个应用。在数字通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,这一过程被

称为编码。在传送电文时,总是希望电文代码尽可能短,采用哈夫曼编码构造的电文的总长最短。

---- 由常识可知,电文中每个字符出现的概率是不同的。假定在一份电文中,A,B,C,D四种字符出现的概率是4/10,1/10,3/10,

2/10,若采用不等长编码,让出现频率低的字符具有较长的编码,这样就有可能缩短传送电文的总长度。

---- 采用不等长编码时要避免译码的二义性和多义性。假设用0表示C,用01表示D,则当接收到编码串01,并译码到0时,是立即译出

C,还是接着下一个字符1一起译为对应的字符D,这样就产生了二义性。 因此,若对某一字符集进行不等长编码,则要求字符集中

一字符的编码不能是其他字符编码的前缀,符合此要求的编码叫做前缀编码

---- 为了使不等长编码也是前缀编码,可以用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得最短的电文长度,可将

每个字符出现的频率作为字符的权值赋予对应的叶子结点,求出此树的最小带权路径长度就是电文的最短编码。

---- 可以根据哈夫曼算法构造哈夫曼树T。设需要编码的上述电文字符集d={A,B,C,D},在电文中出现的频率集合p={4/10,1/10,3/10,2/10}

我们以字符集中的字符作为叶子结点、频率作为权值,构造一棵哈夫曼树。

                     

其中,每个结点分别对应一个字符,对T中的边做标记,把左分支记为“0”,右分支标记为“1”。定义字符的编码是从根结点到该字符所对

应的叶子结点的路径上,各条边上的标记所组成的序列就是哈夫曼编码。

---- A的编码:0,C的编码:10,D的编码:110,B的编码:111.

显然对于任意字符集,总能构造出这样的编码二叉树。由于在任何一条从根结点到一个叶子结点的路径上一定不会出现其他叶子结点,

所以通过这种方法得到的编码一定是前缀编码,通过遍历二叉树,可以求出每个字符的编码。


http://chatgpt.dhexx.cn/article/qRY0s8MA.shtml

相关文章

哈夫曼树的C语言实现

什么是哈夫曼树 当用 n 个结点&#xff08;都做叶子结点且都有各自的权值&#xff09;试图构建一棵树时&#xff0c;如果构建的这棵树的带权路径长度最小&#xff0c;称这棵树为“最优二叉树”&#xff0c;有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时&#xff0…

哈夫曼树的构建及编码

哈夫曼树的构建及编码 文章目录 哈夫曼树的构建及编码一、什么是哈夫曼树二、什么是哈夫曼编码三、怎么建哈夫曼树、求哈夫曼编码四、为什么哈夫曼编码能实现压缩 声明&#xff1a;关于文件压缩&#xff0c;不是本文的重点&#xff0c;本文只说明并讨论哈夫曼树的构建和编码&am…

如何构建一棵哈夫曼树

给一个数列{10,7,8,3,26,5,1},要求转成为一棵哈夫曼树。 分析思路以及图解&#xff1a; 第一步&#xff1a;将数列进行排序&#xff0c;按从小到大的顺序。最终结果为{1,3,5,7,8,10,26}&#xff0c;根据每个数值创建结点&#xff0c;组成结点数组 第二步&#xff1a;取出权值最…

哈夫曼树 (100分)哈夫曼树

4-1 哈夫曼树 (100分)哈夫曼树 第一行输入一个数n&#xff0c;表示叶结点的个数。 需要用这些叶结点生成哈夫曼树&#xff0c;根据哈夫曼树的概念&#xff0c;这些结点有权值&#xff0c;即weight&#xff0c;题目需要输出哈夫曼树的带权路径长度&#xff08;WPL&#xff09;。…

哈夫曼树的编码和解码

哈夫曼树的作用&#xff1a;在数据通信中&#xff0c;需要将传送的文字转换成二进制的字符串&#xff0c;用0&#xff0c;1码的不同排列来表示字符。例如&#xff0c;需传送的报文为“AFTER DATA EAR ARE ART AREA”&#xff0c;这里用到的字符集为“A&#xff0c;E&#xff0c…

哈夫曼树与哈夫曼编码

哈夫曼树 给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大的结点离根较近。 树节点间的边…

【例题】哈夫曼树

【例1】由五个分别带权值为9&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;14的叶子结点构成的一棵哈夫曼树&#xff0c;该树的带权路径长度为_______________。 A、60 B、66 C、67 D、50 答案&#xff1a;C 解析&#xff1a; 关键点在于要学会如何构造哈夫曼树 已知有5…

哈夫曼树以及哈夫曼算法

目录 一、哈夫曼树的定义 二、哈夫曼树的特点 三、哈夫曼算法(构造哈夫曼树的方法) 四、哈夫曼树的构造过程 五、哈夫曼树构造算法的实现 一、哈夫曼树的定义 1、哈夫曼树:最优树即带权路径长度(WPL)最短的树 “带权路径长度最短”是在"度相同”的树中比较而得的结果…

哈夫曼树的绘制

数据结构之哈夫曼树绘制 本人还是一个年轻的程序猿(还是个学生)&#xff0c;请大家多多指教&#xff01; 哈夫曼树 已知权重绘制哈夫曼树 开始我的表演 Step 1. 已知权重&#xff1a;2&#xff0c;3&#xff0c;3&#xff0c;4&#xff0c;7&#xff0c;6 Step 2. 选取其中…

哈夫曼树 哈夫曼编码

哈夫曼树 哈夫曼树的定义&#xff1a;设二叉树具有 n 个带权值的叶节点&#xff0c;那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和&#xff0c;叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tr…

哈夫曼树(Huffman Tree)

定义 哈夫曼树又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到根结点的路径长度&#xff08;若根结点为0层&#xff0c;叶结点到根结点的路径长度为叶结点的层数&#xff09;。树的路径长度是…

哈夫曼树详解

一、哈夫曼树的介绍 Huffman Tree&#xff0c;中文名是哈夫曼树或霍夫曼树&#xff0c;它是最优二叉树。 定义&#xff1a;给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若树的带权路径长度达到最小&#xff0c;则这棵树被称为哈夫曼树。 这个定义里面涉…

哈夫曼树(Huffmantree)

1.基本概念 哈夫曼树又称为最优树&#xff0c;是一类带权路径长度最短的树。 一些概念的定义&#xff1a; &#xff08;1&#xff09;路径&#xff1a;树的两个结点之间的连线称为路径。 &#xff08;2&#xff09;路径长度&#xff1a;路径上的分支数目称作路径长度。若规定…

哈夫曼树详解及其应用(哈夫曼编码)

一&#xff0c;哈夫曼树的基本概念 路径&#xff1a;从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度&#xff1a;两结点之间路径上的分支数 树的路径长度&#xff1a;从树根到每一个结点的路径长度之和&#xff0e;记作&#xff1a;&#xff3…

哈夫曼树编码的实现+图解(含全部代码)

目录 哈夫曼树的基本概念 ------------哈夫曼树的构造方法 ------------------------哈夫曼编码 ------------------------------------全部代码 哈夫曼树的基本概念 哈夫曼树通常以二叉树的形式出现&#xff0c;所以也称最优二叉树&#xff0c;是一类带权路径长度最短的树…

哈夫曼树(C语言实现)

文章目录 哈夫曼树的基本概念哈夫曼树的构建构建思路代码实现 哈夫曼编码的生成编码生成思路代码实现 完整代码展示以及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前&#xff0c;你必须知道以下几个基本术语&#xff1a; 1、什么是路径&#xff1f; 在一棵树中&#xff0c…

打开VS2010提示:产品密钥框

打开VS2010提示&#xff1a;产品密钥框&#xff0c;如下图&#xff1a; …

VS 2017 产品密钥

个人分类&#xff1a; vs2010 Visual Studio 2017&#xff08;VS2017&#xff09; 企业版 Enterprise 注册码&#xff1a;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017&#xff08;VS2017&#xff09; 专业版 Professional 激活码key&#xff1a;KBJFW-NXHK6-W4WJM-CRM…

vs++2010学习版的注册密钥

6VPJ7-H3CXH-HBTPT-X4T74-3YVY7 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行…

存储过程入门

参考文章 Oracle Database concepts guide&#xff08;11g2&#xff09; By Thomas KyteStored Procedure Wiki 先修知识 数据库的基本概念SQL 什么是存储过程&#xff08;Stored Procedure&#xff09;&#xff1a; 一段存储在数据库的“子程序”&#xff0c;下面对这两个…