《数据结构》—— 哈夫曼树

1. 带权路径长度

在这里插入图片描述
结点的权: 有某种现实含义的数值(如:表示结点的重要性等)
结点的带权路径长度: 从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。例如:叶子节点为5= 结点值*路径长度 = 5 *3=15

树的带权路径长度: 树中所有叶结点的带权路径长度之和(WPL, Weighted Path Length)
在这里插入图片描述
【注意】:只算叶子结点!

在这里插入图片描述

2. 哈夫曼树的构造

在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树。也称最优二叉树。例如,上图的第2、3二叉树都是哈夫曼树。

给定n个权值分别为w1, w2,w3,…, wn的结点集合,如何构造哈夫曼树?

  1. 从这些结点中,找出来两个权值最小的结点构成兄弟,以左小右大的方式;
  2. 1步骤兄弟组成的根节点的权值是 兄弟权值之和;
  3. 然后再从结点集合中找出2个权值最小的结点构成兄弟,重复1 2 步骤,最终得到一棵二叉树。

在这里插入图片描述
WPL = 23+43+52+71=6+12+10+7=35

特点:

  • 每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大;
  • 哈夫曼树的结点总数为2n − 1;
  • 哈夫曼树中不存在度为1的结点;
  • 哈夫曼树并不唯一,但WPL必然相同且为最优。

3. 哈夫曼编码

原理:

  • 将每个出现的字符当作一个独立的结点,其权值为它出现的频度(或次数),构造出对应的哈夫曼树;
  • 将字符的编码解释为从根至该字符的路径上边标记的序列;
  • 其中边标记为0表示"转向左孩子",标记为1表示"转向右孩子"。

哈夫曼编码可用于数据压缩。
固定长度编码——每个字符用相等长度的二进制位表示;
可变长度编码——允许对不同字符用不等长的二进制位表示;
若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码

假设100题中有80题选C,10题选A,8题选B,2题选D
所有答案的二进制长度=80* 2+10* 2+8* 2+2* 2=200 bit。
构成二叉树:
在这里插入图片描述
即:A–00,B–01,C–10,D–11。


构成哈夫曼树是:结点A权值10,B值8,C值80,D值2。
在这里插入图片描述
即:C–0 ,A–10,B–111,D–110。(可变长度编码)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
哈夫曼树是一种最优二叉树,它的构造算法如下:首先将n个结点作为n棵仅含有一个根结点的二叉树,构成一个森林F。然后,生成一个新结点,并从F中找出根结点权值最小的两棵树作为它的左右子树,新结点的权值为两棵子树根结点的权值之和。接着,从F中删除这两个树,并将新生成的树加入到F中。重复以上步骤,直到F中只有一棵树为止。 哈夫曼树具有以下性质: 1)每个初始结点都会成为叶节点,双支结点都为新生成的结点 2)权值越大离根结点越近,反之权值越小离根结点越远 3)哈夫曼树中没有结点的度为1 4)n个叶子结点哈夫曼树的结点总数为2n-1,其中度为2的结点数为n-1。 哈夫曼树的应用之一是解决编码问题。在编码中,我们使用二进制来表示字符,其中固定长度编码和前缀编码是两种常见的编码方式。前缀编码要求没有一个编码是另一个编码的前缀,而哈夫曼树构造的编码正是满足前缀编码的要求。 所以,哈夫曼树数据结构考研中是一个重要的概念,它可以用于构造最优二叉树和解决编码问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数据结构考研笔记(十六) ——哈夫曼树、编码应用](https://blog.csdn.net/sf9090/article/details/109154652)[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
发出的红包

打赏作者

唐樽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值