哈夫曼树:

当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。
在构建哈弗曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树根越近。在图 1 中,因为结点 a 的权值最大,所以理应直接作为根结点的孩子结点。

哈夫曼树相关的几个名词

路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。

路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。

结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。

结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如,图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。

构建哈夫曼树过程(1):

对于给定的有各自权值的 n 个结点,构建哈夫曼树有一个行之有效的办法:

  1. 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
  2. 在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
  3. 重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。

构建哈夫曼树过程(2):

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

如:对 下图中的六个带权叶子结点来构造一棵哈夫曼树,步骤如下:

性质

每个初始结点都会成为叶子结点,双支结点都为新生成的结点
权值越大离根结点越近,反之离根结点越远
哈夫曼树中没有结点的度为1 (叶子节点:0 ,分支结点:2 )
n个叶子结点的哈夫曼树的结点总数为2n − 1,其中度为2的结点数位n − 1

哈夫曼树结构及带权路径长度相关推荐

  1. 自动计算哈夫曼树的带权路径长度

    C语言自动计算哈夫曼树的带权路径长度: #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const voi ...

  2. 给定结点权值,求哈夫曼树的带权路径长度和

    1.哈夫曼树概念 一棵树中,从任意一个结点到达另一个结点的通路叫做路径,该路径包含的边的个数称为路径长度,每个结点带有的表示某种意义的值成为权值.从根结点到叶子结点的路径长度乘以叶子节点权值,得到的值 ...

  3. 哈夫曼树的带权路径长度和

    正常想要计算哈夫曼树的路径长度之和,是遍历一遍树,将叶结点的权值乘上深度再加和. 那么对于路径和的计算有这样一个公式: 哈夫曼树的带权路径长度和=等于所有非叶节点的权值和 所以说我们只需要每次将数组前 ...

  4. 哈夫曼树的带权路径长度总结wpl

    //哈夫曼树的带权路径长度 //总结 //法一:①先对权值从小到大排序. //②选两个最小的加起来成为一个新结点,而这两个最小的值是新结点的左右子结点. //③两个老的结点去掉,新的结点放入再次排序然 ...

  5. 哈夫曼带权路径长度C语言,解决关于哈夫曼编码计算带权路径长度问题

    这是在做一道编程提示遇到的,学习了一位博主的编码,其中有些问题未能理解,分析解决掉. 首先什么是哈夫曼树: 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树. 也就是根节点到节点的中的长度最小,当 ...

  6. 哈夫曼树与带权路径长度

    问题: 权值分别为从19,21,2,3,6,7,10,32的结点,构造一棵哈夫曼树,该树的带权路径长度是? 哈夫曼树的一个应用: 压缩字符串https://blog.csdn.net/dyingstr ...

  7. 算法学习笔记——数据结构:哈夫曼树、带权路径长度WPL、哈夫曼编码

    引入 合并果子问题如下: 有n堆果子,每次可以合并任意两堆果子,耗费体力值为[两堆果子数之和],最终在n-1次合并后,得到一堆果子. 给出合并的方案,使得耗费的体力值最小 例如有3堆果子,质量依次为1 ...

  8. 哈夫曼树(带权路径长度+树的带权路径长度+哈夫曼树定义+构造哈夫曼树+哈夫曼树性质+哈夫曼编码+计算平均码长-这里指WPL)

    带权路径长度 树的带权路径长度WPL 哈夫曼树 哈夫曼树构造 哈夫曼树性质 哈夫曼编码 固定长度编码 可变长编码 前缀编码 固定长度编码.可变长编码.前缀编码.哈夫曼编码 思维倒图 试题

  9. 每天一道数据结构练习题(给定权值求出哈夫曼树的带权路径长度)

    名词解释: 带权路径长度也就是树的带权路径长度,树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 结点的权:在一些应用中,赋予树中结点的一个有某种 ...

最新文章

  1. 即将 50 岁的雷军,重新回到手机战场
  2. 工业机器人电柜布线_协作并联,重新注解并联机器人
  3. JVM技术周报第2期
  4. zTree树形菜单交互选项卡效果实现
  5. android 全局对话框(不依赖具体activity)
  6. 14.cookie与自动登陆
  7. 蓝桥杯 基础练习 数列排序
  8. Linux Shell 重定向到文件以当前时间命名
  9. window-运行perl脚本(搭建health-check环境)
  10. python程序设计基础与应用 机械工业出版社_Python程序设计基础与应用
  11. @Valid不起效,发现BindingResult读取不到Error信息
  12. 微信python课_微信课程提醒助手———python
  13. Linux 给我的七个宝贵教训
  14. 用python写个小游戏难吗_小伙用Python制做一个小游戏,结果6秒就结束,怎么难玩?...
  15. 乐视max2 刷入第三方recovery 然后刷入root 包 root
  16. CesiumJS 中文学习手册
  17. Dagger2的简单使用及基本原理
  18. 程序员的算法趣题Q62: 日历中的最大矩形
  19. 用python求3的阶乘_Python 阶乘实例 - Python 3 基础教程
  20. 英语口语收集(三十七)

热门文章

  1. 太原理工大学计算机科学与技术老师 王颖,王颖 - 太原理工大学 - 信息与计算机学院...
  2. python popen sqlplus_Python用subprocess的Popen来调用系统命令
  3. 牵手新伙伴,云和恩墨 zCloud 与 SmartX 完成兼容性认证
  4. ready_valid 协议
  5. softmax单元_三分钟带你对 Softmax 划重点
  6. Centos7下Samba服务器配置(实战)
  7. 重磅!认知智能已来!人工智能将被取代!且看道翰天琼认知智能为您揭秘人工智能和认知智能的区别。
  8. void* 作为函数参数,函数返回值的用法
  9. Oracle 12c CDBPDBs管理
  10. flutter Map遍历循环使用break