哈夫曼树的构建与最小带权路径长度

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

  • 二叉树:每个结点最多含有两个子树的树称为二叉树。
  • 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点。

哈夫曼树的构建与最小带权路径长度

哈夫曼树介绍

1哈夫曼树的定义

哈夫曼(Huffman)树,又称最优二叉树,是由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。给定n个数值{ W1,W2,…,Wn},若将它们作为n个结点的权,并以这n个结点为叶子结点构造一颗二叉树,那么就可以构造出多棵具有不同形态的二叉树,其中带权路径长度最短的那棵二叉树称为哈夫曼树,或称最优二叉树。如图(二)所示:

哈夫曼树的构建与最小带权路径长度

WPL:树中从根到所有叶子结点的各个带权路径长度之和

2 构建哈夫曼树的方法

如下:

(1) 初始化:根据给定的n个权值{W1,W2,….,Wn}构造n棵二叉树的森林T{T1,T2,…Tn},其中每棵二叉树Ti (1≤i≤n)中都只有一个带权Wi为的根结点,其左、右子树均为空。

(2) 找最小树:在森林T中选取两棵结点权值最小的子树分别作为左、右子树构造一棵新的二叉树、且使左子树的权值小于右子树的权值、且置新的二叉树的根结点的权值为其左、右子树上根结点权值之和。

(3) 删除与加入:在森林T中,删除这二棵树,同时将新得到的二叉树加入T中。

(4) 判断:重复(2)与(3)操作,直到T只含一棵二叉树树为止,这棵树便是哈夫曼树。如图(三)所示:

哈夫曼树的构建与最小带权路径长度

因为权值的不同,哈夫曼树的样子有点不同,为了加深对哈夫曼树构建过程的认识,笔者再列举一个哈夫曼树的构建,见图(四):

哈夫曼树的构建与最小带权路径长度

(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。
注:如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。)比如比较最小两个 7 10 11 所以只能另起一个哈夫曼树的构建与最小带权路径长度

(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。 好了,此时哈夫曼树已经构建好了。

哈夫曼树的构建与最小带权路径长度

Original: https://www.cnblogs.com/2zly/p/13405836.html
Author: 颖火虫赵云
Title: 哈夫曼树的构建与最小带权路径长度

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590493/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • spring 是如何注入对象的和bean 创建过程分析

    文章目录: 首先需要知道一个大致实现 这个注入过程肯定是在 BeanPostProcessor 中实现的 spring 是在 beanFactory.getBean 进行 bean…

    Java 2023年6月5日
    092
  • git开发

    git是一个分布式版本控制软件。git分为三个部分: 工作区 写文件的地方 暂存区 将add的文件复制一份到./.git/index 版本库 将暂存区的文件移动进来 初始化 cd …

    Java 2023年6月7日
    0104
  • XML解析

    使用dom4j解析xml 通过反射,如果自己能够创建好Vo文件 对应XML文件中的节点 public FaultReportVo readHdrXml(String url) th…

    Java 2023年6月16日
    083
  • api接口基础Day2

    十六进制的权: 16的0次幂————-1 16的1次幂————-16 16的2次幂————-256 16的3次幂———-…

    Java 2023年6月13日
    085
  • Redis缓存更新策略

    Redis缓存更新策略 本文整理自黑马程序员相关资料 内存淘汰 超时剔除 主动更新 说明 不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓…

    Java 2023年6月8日
    0134
  • Eureka多节点数据不同步问题

    前言 以下为找到问题后搜到的文章,这里做下记录,如果解决了您的问题可以为原位作者点赞 以下为原文 转载自joshua317博客 Spring Boot-yaml格式,eureka客…

    Java 2023年6月8日
    089
  • 如何在Linux中指定安装nodejs的版本

    如何在Linux中指定安装nodejs的版本 1.序言 在日常使用中,你可能会在安装软件包的时候遇到这种错误: warning Resolution field "@ty…

    Java 2023年6月7日
    083
  • 【Spring boot】双数据源/多数据源 spring boot+druid配置多数据源详细配置

    1.pom.xml文件 2.启动类 3.yml配置文件 4.自定义DataSourceConfig 5.Mapper.java 和 Mapper.xml的说明 Original: …

    Java 2023年5月29日
    065
  • Final

    final 基本介绍: final可以修饰类、属性、方法和局部变量 下面情况下可能会用到final 当不希望类被继承时,可以用final修饰; 当不希望父类的某个方法被子类覆盖/重…

    Java 2023年6月5日
    082
  • Centos静默安装Oracle11G

    环境准备 Oracle 11gR2 64位 Linux版安装包 linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_…

    Java 2023年6月8日
    0104
  • Vuex项目Example中的源码学习(1)

    @ counter 代码跑起来 项目结构 项目效果 揣测下大概思路 具体代码实现 学习到的知识点 counter 代码跑起来 从github上把代码下载下来(https://git…

    Java 2023年6月7日
    0117
  • Java学习-第一部分-第三阶段-项目实战:多用户即时通讯系统

    service ClientConnectServerThread package com.hspedu.qqclient.service; import com.hspedu.q…

    Java 2023年6月15日
    085
  • 通过源码了解Java的自动装箱拆箱

    什么叫装箱 & 拆箱? 将int基本类型转换为Integer包装类型的过程叫做装箱,反之叫拆箱。 首先看一段代码 public static void main(Strin…

    Java 2023年6月5日
    075
  • 3、元注解,自定义注解

    元注解 元注解的作用就是负责注解其他注解Java 定义了4 个标准的meta-annotation 类型, 他们被用来提供对其他annotation 类型作说明 这些类型和它们所支…

    Java 2023年6月8日
    090
  • 使用列表

    前言:列表是一种非常有用的数据排列方式,它以列表的形式来显示数据。HTML中共有3种列表,分别是无序列表、有序列表和定义列表。无序列表的所有列表项目之间没有先后顺序之分。有序列表的…

    Java 2023年6月5日
    099
  • Java程序员必备的工具和框架

    最近几年,Java 的技术栈发展的非常快,成百上千的技术工具正不断地涌出来,这也造成了一个问题: 我们作为开发者,到底应该选哪些工具搭建出最合适的技术栈呢? 今天我就推荐一波我常用…

    Java 2023年6月7日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球