学习笔记-创建赫夫曼树

2023-11-15

赫夫曼树

给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。
赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

一些概念:

  1. 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L层结点的路径长度为 L-1。
  2. 结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
  3. 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为 WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树。
  4. WPL 最小的就是赫夫曼树。
    在这里插入图片描述

创建赫夫曼树的思路

将一个数组创建为赫夫曼树。因为涉及到排序,就借用List实现。

首先创建树结点。为了实现自定义类的排序,让树节点实现Comparable接口,重写compareTo方法。这样做的目的是我们可以调用Collections.sort()或.sort()方法对我们的自定义类Node组成的List进行从小到大排序。(如果需要从大到小排序,compareTo方法就写成-(this.value-o.value))

class Node implements Comparable<Node>{
   
    public int value;//节点的权值
    Node left;//左子节点
    Node right;//右子节点
    public Node(int value){
   
        this.value=value;
    }
    //前序遍历
    public void preOrder(){
   
        System.out.println(this);
        if</
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记-创建赫夫曼树 的相关文章

随机推荐

  • WDK_学习笔记_区块链+ViT和Swin transformer

    文章目录 摘要 一 項目 Hyperledger fabric技术的深入学习 1 1 安装 2 2 0 只记录问题 其余按文档操作即可 二 深度学习 Version Transformer ViT 和Swin Transformer 2 1
  • 【Unity从零开始制作空洞骑士】①制作人物的移动跳跃转向以及初始的动画制作

    事情的起因 首先我之前在b站的时候突然发现有个大佬说复刻了空洞骑士 点进去一看发现很多场景都福源道非常详细 当时我除了觉得大佬很强的同时也想自己试一下 而且当时对玩家血条设计等都很模糊 就想着问up主 结果因为制作的时间过了很久了 大佬也有
  • Mock入门

    关键参数 name 唯一标识 return value 当被调用时 返回的值 可为函数 side effct 当存在时 return value不生效 返回side effect 导入库 from unittest import mock
  • 用户画像-标签体系

    1 前言 最近在学习用户画像 翻看了 彭友会 的七十多份资料 简单过了一遍赵宏田老师的书 最近又看了许多微信公众号里的文章 整体感受就是 资料太杂 内容太乱 重复的太多 相互间也会有些冲突 但大致可以归为两类 赵宏田老师的一套 另外其它的一
  • PDF文件复制文字

    最近在看电子书时 发现有的一些 PDF 文件看起来像是扫描的 但能直接复制文字 有的则不能 查找相关资料后明白了 不能复制的pdf文件 01 pdf文件加密了 02 扫描和图形格式做的PDF文件 PDF文件如果加密了 对于一些不允许做修改
  • Android关于AutoService、Javapoet讲解

    AutoService会自动在META INF文件夹下生成Processor配置信息文件 该文件里就是实现该服务接口的具体实现类 而当外部程序装配这个模块的时候 就能通过该jar包META INF services 里的配置文件找到具体的实
  • ChatGPT不能代替人类写作的四个原因

    近期留学圈最火的C位当属ChatGPT 作为一款OpenAI开发的语言模型 ChatGPT在文本生成上的优秀表现大大助力了母语非当地语言的留学生们 写邮件 翻译并理解文本乃至写代码 ChatGPT似乎所向披靡 不少同学也产生了这个想法 用它
  • pageHelper分页失效解决方案

    前言 pageHelper是一款优秀的Mybatis分页插件 在项目中可以非常便利的使用 使开发效率得到很大的提升 但不支持一对多结果映射的分页查询 所以在平时的使用时 对于一对多分页会出现分页错误 这篇文章主要对pageHelper分页错
  • activiti学习之服务任务

    写在前面 对于工作流 我们使用最多的是用户任务节点 用户任务节点就是给用户来生成任务的 需要人来手动的处理 而与之对应的还有服务任务节点 这种类型的节点需要人手动的参与而是程序来执行 即执行某个类的某个方法 这个类一般是org activi
  • Java 实现 MD5 加密算法

    1 MD5 加密算法 1 1 MD5 算法介绍 MD5 消息摘要算法 英文 MD5 Message Digest Algorithm 一种被广泛使用的密码散列函数 可以产生出一个128位 16字节 的散列值 hash value 用于确保信
  • 子图匹配算法——VF2算法讲解

    讲的很通透了 https zhuanlan zhihu com p 259393192
  • CSS五款超好用的布局网站

    CSS Grid Generator https cssgrid generator netlify app CSS Layout https csslayout io Flexbox Generator https loading io
  • vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK

    目录 0 结果展示 1 cmake要点 2 编译报错解决 3 参考链接 0 结果展示
  • 吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

    Chisel时序电路 三 Chisel移位寄存器 Shift Register 详解 上一篇文章介绍了Chisel计数器以及一些高级用法 内容很多 学下来肯定收获也会很多 除了计数器以外 还有一种寄存器的应用十分广泛 那就是移位寄存器 这一
  • Linux Test Project(一)

    http www vimlinux com lipeng 2014 09 12 ltp Testing Linux one syscall at a time LTP是从SGI开始的 后由IBM 思科 富士通 SUSE Redhat等组织开
  • Java多线程下 ThreadLocal 的应用实例

    ThreadLocal很容易让人望文生义 想当然地认为是一个 本地线程 其实 ThreadLocal并不是一个 Thread 而是 Thread 的局部变量 也许把它命名为 ThreadLocalVariable更容易让人理解一些 当使用
  • jQuery Ajax 初始化方法

    ajaxSetup headers Authorization auth token cache false 禁用缓存 dataType json contentType application json contentType appli
  • 《深入理解java虚拟机》笔记

    深入理解java虚拟机 走进java java不仅仅是一门编程语言 还是一个由一系列计算机软件和规范形成的技术体系 她有以下优点 结构严谨 面向对象 摆脱硬件平台的限制 实现了一次编写 到处运行 提供了一个相对安全的内存管理和访问机制 有一
  • 面向文本和视觉线索联合推断的多模态上下文推理方法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 报告题目 面向文本和视觉线索联合推断的多模态上下文推理方法 内容简介 联合文本和视觉线索条件推理任务是一项复杂多模态推理任务 其中 文本线索提供与视觉内容互补的先验假设或者外部知
  • 学习笔记-创建赫夫曼树

    赫夫曼树 给定 n 个权值作为 n 个叶子结点 构造一棵二叉树 若该树的带权路径长度 wpl 达到最小 称这样的二叉树为最优二叉树 也称为哈夫曼树 Huffman Tree 还有的书翻译为霍夫曼树 赫夫曼树是带权路径长度最短的树 权值较大的