数据结构【哈夫曼树】

哈夫曼树的概念

最优二叉树也称哈夫曼 (Huffman) 树,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

涉及到的几个概念:
路径:
从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
结点的路径长度:
两结点间路径上的分支数。
树的路径长度:
从树根到每一个结点的路径长度之和。记作: TL。
权(weight):
将树中结点赋给一个有着某种含义的数值则这个数值称为该结点的权。
结点的带权路径长度:
从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:
树中所有叶子结点的带权路径长度之和。
二叉树的带权路径长度 (Weighted Path Length):
二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。
如果二叉树中的所有叶子结点都具有一个特定的权值,则可将这一概念加以推广。设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与该叶子结点相应的权值的乘积之和叫做又树的带权路径长度,记为:
在这里插入图片描述
其中,wk为第k个叶子结点的权值,Lk为第k个叶子结点的路径长度。
在这里插入图片描述
最优树:带权路径长度(WPL)最短的树

注:
“带权路径长度最短”是在“度相同”的树中比较而得的结果,因此有最优二叉树、最优三叉树之称等等。

最优二叉树:带权路径长度(WPL)最短的二叉树

因为构造这种树的算法是由哈夫曼教授于 1952 年提出的所以被称为哈夫曼树,相应的算法称为哈夫曼算法。

哈夫曼树的构造

哈夫曼算法(构造哈夫曼树的四句口诀)
(1)根据n个给定的权值{ w1、w2、…、wn}构成n棵二叉树的森林F=(T1、T2、…、Tn},其中Ti只有一个带权为 wi的根结点。
构造森林全是根
(2)在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
选用两小造新树
(3)在F中删除这两棵树,同时将新得到的二又树加入森林中。
删除两小添新人
(4)重复(2)和(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树。
重复 2、3 剩单根
在这里插入图片描述

可以得出:
1)哈夫曼树的节点的度为0或2,没有度为1的节点。
2)包含n个叶子节点的哈夫曼树中共有2n-1个节点。
3)包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1个新节点。

构造算法的实现

顺序结构存储–一维结构数组

typedef struct (
	int weight;
	int parent, lch, rch;
)HTNode,*HuffmanTree;

先初始化再构造
1.初始化HT[1…2n-1]: lch=rch=parent=0;
2. 输入初始n个叶子结点: 置HT[1…n]的weight值;
在这里插入图片描述
3.进行以下n-1次合并,依次产生n-1个结点HT[i],i=n+1…2n-1:
a) 在HT[1.i-1]中选两个未被选过(从parent ==_0 的结点中选)的weight最小的两个结点HT[s1]和HT[s2],s1、s2为两个最小结点下标;
修改HT[s1]和HT[s2]的parent值: HT[s1] .parent=i; HT[s2] .parent=i;b)修改新产生的HT[i]:
HT[il.weight=HT[s1].weight + HT[s2].weight
HT[i]. lch=s1; HT[i]. rch=s2;
在这里插入图片描述

哈夫曼树应用

哈夫曼编码

在这里插入图片描述

哈夫曼编码的算法实现

在这里插入图片描述
示例:
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种特殊的二叉结构,用于编码和解码数据。在哈中,每个叶子节点都代表一个字符或符号,并且具有一个与之关联的权值,代表该字符或符号出现的频率或概率。根据哈的概念,我们可以通过给定的叶子节点的权值来构建哈。 对于给定的叶子节点的权值,构建哈的步骤如下: 1. 首先,根据叶子节点的权值从小到大进行排序。 2. 选取权值最小的两个叶子节点,并将它们作为两个子节点创建一个新的父节点。新父节点的权值等于这两个子节点的权值之和。 3. 将这个新的父节点插入到叶子节点中,同时删除原来的两个子节点。 4. 重复步骤2和步骤3,直到只剩下一个节点,即根节点,这个节点就是哈的根节点。 根据题目提供的例子,我们可以看到一种不是建的方法,只使用数组来模拟哈的构造过程。这种方法是通过数组来存储节点的信息,并通过一些特定的计算方式来模拟构建哈的过程。 根据题目的描述,我们需要根据叶子节点的个数和权值来生成哈,并计算所有节点的值与权值的乘积之和。这个问题可以通过构建哈的步骤来解决。首先,我们需要将叶子节点根据权值进行排序。然后,按照步骤2和步骤3构建哈,直到只剩下一个节点。最后,计算所有节点的值与权值的乘积之和。 综上所述,数据结构的例题是通过给定叶子节点的权值来构建哈,并计算所有节点的值与权值的乘积之和。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [超好理解的哈(最优二叉)与例题](https://blog.csdn.net/weixin_45720782/article/details/109316157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值