注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。

第一部分;由给定结点构造哈夫曼树

(1)8个结点的权值大小如下:


(2)从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出这两个结点的和5。


(3)从19,21,6,7,10,32,5中选出两个权小结点。选中5,6。同时计算出它们的和11。


(4)从19,21,7,10,32,11中选出两个权小结点。选中7,10。同时计算出它们的和17。
(BTW:这时选出的两个数字都不是已经构造好的二叉树里面的结点,所以要另外开一棵二叉树;或者说,如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。)

(5)从19,21,32,11,17中选出两个权小结点。选中11,17。同时计算出它们的和28。


(6)从19,21,32,28中选出两个权小结点。选中19,21。同时计算出它们的和40。另起一颗二叉树。


(7)从32,28, 40中选出两个权小结点。选中28,32。同时计算出它们的和60。


(8)从 40, 60中选出两个权小结点。选中40,60。同时计算出它们的和100。 好了,此时哈夫曼树已经构建好了。

第二部分:由上述所得哈夫曼树写出哈夫曼编码

首先我们来看这棵构造好的哈夫曼树:(经过左边路径为0,经过右边路径为1)

则可直接写出编码,例如:

A:11   B:001    C:011  D   E:0000    F:0001    G:0100    H:0101    I:1000   J:1001

为了简便起见,我们从树的左边开始考虑,即B,E,F节点。

对于节点B,其深度为3,权值为5,那么其带权路径长度为5*3 = 15;

那么我们再看一下节点B的父亲节点,其权值为9,是由权值为4和权值为5的节点B构造而成,那么即是9 = 4 + 5;

同样的再往上一层,节点B的爷爷节点,其权值为16,是由权值为9和权值为7的节点构造而成,而权值为9的节点的构造前面已经说明,则有16 = 4 + 5 + 7;

再往上一层就到根节点了。

那么到这里我们可以看到,节点B的父亲节点和爷爷节点的组成部分都有节点B的“功劳”,即节点B的权值是其另外两个的“组成部分”,那么节点B的带权路径长度即为其到根节点路径上(不包含根节点),与其(或者说是与其父节点,爷爷节点等)有父子关系的节点抽取出节点B的组成部分(包括节点B本身),再全部相加,这样的话就得到了节点B的带权路径长度为5 + 5 + 5 = 15;

同样的,节点E,F按照同样的方法进行推导。

所以我们从上面的分析得出:

每个带权叶节点到根节点的带权路径长度等于其到根节点路径上所有节点的包含该带权叶节点权值组成部分之和。

因此,最后我们推导出,所有叶节点,即整棵哈夫曼树的带权路径长度 WPL即为:

除了根节点以外,所有节点的权值之和。

如上图哈夫曼树的带权路径长度 WPL即为:

WPL = 16 + 10 + 9 + 7 + 5 + 5 + 4 + 5 + 3 + 4 + 2 + 3 + 2 + 2 + 2 + 1 + 1 + 1 = 82

有了这样的判断之后,我们便很容易计算出一颗哈夫曼树的带权路径WPL了。

因此我们可以借助一个叫做优先队列的数据结构,而优先队列的实现往往是借助于二叉堆的结构实现,在这里我们要实现的是小根堆的数据结构。一开始的时候,我们可以将所有的节点一个一个的压入队列中,每次有节点入队,队列都会进行自调整,使其保持一个小根堆的状态。当所有的节点全部入队之后,这时候我们根据以上推导出来的结论,每次取两个权值最小的节点,将其值计算之后,然后再将两个节点权值之和的节点压入队列中,直到队列中只剩下一个节点(即根节点),跳出循环体,输出最后的答案。即整棵哈夫曼树的带权路径WPL。

哈夫曼树以及哈夫曼编码的构造步骤相关推荐

  1. 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码

    实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...

  2. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  3. python哈夫曼树_python霍夫曼树

    class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...

  4. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

    什么是哈夫曼树 哈夫曼树就是一种最优判定树,举个例子,如下一个判断逻辑 if(s<60) g=1; else if(s<70) g=2 else if(s<80) g=3 else ...

  5. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  6. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  7. 听说你还不懂哈夫曼树和哈夫曼编码

    基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...

  8. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  9. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  10. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

最新文章

  1. windows环境下pip安装python的包时候提示invalid syntax (转载CSDN)
  2. tensorflow常见函数——clip_by_value、numpy.random.RandomState、argmax
  3. exe打包工具哪个最好_新华字典现代汉语词典选哪个版本才最好?教你选购工具书...
  4. 学习笔记(18):Python网络编程并发编程-守护进程
  5. 前端学习(7):web的三大技术
  6. 将Linux下编译的warning警告信息输出到文件中
  7. Python数据类型-元组类型
  8. node js 开发网站_使用Node JS开发网站
  9. 苏州大学计算机组成与结构,苏州大学计算机组成结构期末.docx
  10. matlab2008设置子函数断点无效,程序不在断点处停止
  11. homebrew卡在:Updating Homebrew处
  12. 窗函数(Window Function)在信号处理当中的应用
  13. CorelDRAWX4的VBA插件开发(三十二)调用C++实现一键智能群组(第1节)成品演示以及逻辑和声明浅析
  14. adobe acrobat pro字体很怪,有点发虚,不整齐,调整方法
  15. vasp 计算杨氏弹性_高阶弹性常数计算的一点建议
  16. matlab中适应度函数怎么编写,matlab常用的几个适应度评价函数
  17. 计算机专业大学排名及本科录取分数线,计算机专业高考多少分录取?附中国计算机专业大学排名及分数线...
  18. HCSC 2022cvpr 训练报错
  19. hgame 2022 PWN 部分题目 Writeup
  20. Idea打Jar包并生成exe文件(三:Idea打Jar包)

热门文章

  1. 小米三季度业绩下滑,与荣耀、realme的崛起分不开
  2. springboot的filter 过滤器的使用
  3. python编写交互界面设计_Python 如何编写交互界面?
  4. css省略号,css书写顺序,实现滑动,设置滚动条的样式,设置文字的渐变色
  5. hadoop-common源码分析之-Configuration
  6. ttf矢量字库裁剪(工具,使用方法)
  7. 对象转map(object转map)
  8. excel中如何动态地创建控件以显示查询结果_年终汇报,Excel图表真难搞?80份可视化图表帮你10秒搞定...
  9. 新手做自媒体,学会这五点轻松赚钱,新手小白怎么赚钱?
  10. ios 打印 详细错误日志_ios 打印日志注意的点