1120 哈夫曼树的创建遍历查找当前节点的编码

2023-10-30

package com;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Stack;

/**
 * 类说明:  哈夫曼树的创建遍历查找当前节点的编码
 */
public class HaffmanTree {

    TreeNode root;

    /**
     * @version 创建时间: 2017-11-21 下午8:57:01
     * 类说明:声明一个类,
     */
    public static class TreeNode<T> implements Comparable<TreeNode<T>>{
        T data;
        int weight;
        TreeNode leftChild;
        TreeNode rightNode;
        TreeNode parent;

        public TreeNode(T data, int weight) {
            super();
            this.data = data;
            this.weight = weight;
            this.leftChild = null;
            this.rightNode = null;
            this.parent = null;
        }


        @Override
        public int compareTo(TreeNode<T> o) {
            //根据weight来排序
            if(this.weight>o.weight){
                return -1;
            }else if(this.weight<o.weight){
                return 1;
            }
            return 0;
        }
    }




    /**
     * 创建haffman树
     * @param list
     * @return
     */
    public TreeNode createHaffManTree(ArrayList<TreeNode> list){
        while (list.size()>1) {
            //取最小的两个值,构建新的节点,进行排序
            Collections.sort(list);//从大到小排序
            TreeNode leftNode=list.get(list.size()-1);//取最小的值
            TreeNode rightNode=list.get(list.size()-2);//取第二小的值
            TreeNode parent=new TreeNode("data", leftNode.weight+rightNode.weight);
            parent.leftChild=leftNode;
            parent.rightNode=rightNode;
            leftNode.parent=parent;
            rightNode.parent=parent;

            list.remove(leftNode);
            list.remove(rightNode);
            list.add(parent);
        }
        //最终list里面只剩下一个元素
        root=list.get(0);
        return list.get(0);

    }

    /**
     * 遍历哈夫曼树
     * @param root
     * 思路:循环     每次取parent,取出来后,添加leftChild  rightChild
     */
    public void showHaffman(TreeNode root){
        LinkedList<TreeNode> list = new LinkedList<>();
        ArrayList<TreeNode> arrayList = new ArrayList<>();
        list.offer(root);//队列为空时候,使用add方法会报错,而offer方法会返回false,Queue使用时,才会采用 offer/poll/take等方法作为链表对象时,offer等方法相对来说没有什么意义这些方法是用于支持队列应用的。
        while(!list.isEmpty()){
            TreeNode node=list.pop();//取出栈顶元素
            System.out.print(node.data+" ");
            if(node.leftChild!=null){
                list.offer(node.leftChild);
            }
            if(node.leftChild!=null){
                list.offer(node.rightNode);
            }
        }
    }


    /**
     * 获得当前的节点编码   (左子为0  右子为1)
     * @param node
     */
    public void getCode(TreeNode node){
        Stack<String> stack = new Stack<>();
        TreeNode treeNode = node;
        while(treeNode!=null && treeNode.parent !=null){
            //left 0  right 1
            if(treeNode.parent.leftChild == treeNode){
                stack.push("0");
            }else if(treeNode.parent.rightNode == treeNode){
                stack.push("1");
            }
            treeNode=treeNode.parent;
        }
        while (!stack.isEmpty()) {
            System.out.print(stack.pop());
        }
    }



    public static void main(String[] args) {
        ArrayList<TreeNode> list = new ArrayList<>();
        TreeNode<String> node = new TreeNode("good", 54);
        list.add(node);
        list.add(new TreeNode("morning", 10));
        list.add(new TreeNode("afternoon", 20));
        list.add(new TreeNode("hello", 100));
        list.add(new TreeNode("hi", 200));
        HaffmanTree tree = new HaffmanTree();
        tree.createHaffManTree(list);
        tree.showHaffman(tree.root);
        System.out.println();
        tree.getCode(node);
    }

}


运行结果如下:

data data hi data hello data good morning afternoon 


000




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1120 哈夫曼树的创建遍历查找当前节点的编码 的相关文章

  • 笔记:pycharm中ModuleNotFoundError:No Module named ‘sklearn‘ 解决办法

    windows10 Anaconda tensorflow2 1 python3 7 开发环境 pycharm 错误 代码 from sklearn import datasets 报错 ModuleNotFoundError No Mod
  • HTTPS:确保Web安全

    参考书籍 图解HTTP HTTP的不足 1 通信使用明文可能会被窃听 HTTP本身不具备加密的功能 无法对通信整体加密 即HTTP使用的是明文方式发送 加密技术可以防止被窃听 加密对象 通信的加密 HTTP和SSL的组合被称为HTTPS 内
  • 字节跳动开源神器:btrace 2.0 技术原理大揭秘

    项目 GitHub 地址 https github com bytedance btrace 1 背景介绍 在一年多前 我们对外正式开源了 btrace AKA RheaTrace 它是基于 Systrace 的高性能 Trace 工具 目
  • Unmapped Spring configuration files found找到未映射的spring配置文件

    在以下位置配置即可
  • 基于Arduino的智能小车-代码部分

    紧接上篇Arduino智能小车 这篇主要是智能小车的代码部分 首先 定义相关模块引脚 注 这里只是粘贴了部分代码 int sp1 8 定义舵机接口数字接口8 int pulsewidth 定义脉宽变量 int v int val1 int
  • DateFormat类:日期格式化的便捷工具

    系列文章目录 文章目录 系列文章目录 前言 一 什么是DateFormat类 二 格式化日期和时间 三 解析字符串为日期和时间 四 本地化支持 总结 前言 在软件开发中 处理日期和时间是一个常见而重要的任务 为了满足不同的需求 Java提供
  • ubuntu操作系统学习笔记之NFS安装

    1 安装 nfs 服务版 机器一 机器二都要装 服务器端安装 sudo aptitude install nfs common nfs kernel server portmap 在客户端则需要安装 sudo aptitude instal
  • 2022高教杯思路 数模思路

    三年比赛经验 国一美赛F 公众号 千千小屋grow 首先切记获奖的前提是要完成论文模型的全部内容 如果A B题玩成编程和建模难度较大 可以选择C题 注 但选择C题 如果中规中矩的完成大概率与国一国二无缘 但很大概率可以省奖保底 A题 物理类
  • 机器学习-定序回归及python实现

    参考链接 深入浅出机器学习算法 定序回归 机器学习 保序回归 IsotonicRegression 一种可以使资源利用率最大化的算法 scikit learn一般实例之一 保序回归 Isotonic Regression
  • MySQL子查询

    子查询指一个查询语句嵌套在另一个查询语句内部的查询 这个特性从MySQL 4 1开始引入 SQL 中子查询的使用大大增强了 SELECT 查询的能力 因为很多时候查询需要从结果集中获取数据 或者需要从同一个表中先计算得出一个数据结果 然后与
  • 微信小程序和百度的语音识别接口

    介绍 因为项目需要 使用到了微信小程序和百度的语音接口 现在将项目中的一个小模块拿出来单独分享 技术关键字 微信小程序 百度语音接口 nodejs express fluent ffmegp 环境 windows 10 vs code 1
  • adb inputswipe shell_adb shell 基本使用

    连接远程设备 adb connect ip host 端口 获取设备 adb devices 显示adb连接设备列表 adb e d s xxx shell e 模拟器 d 外置设备 s 输入序列号 进入shell后 adb shell 就
  • Qt之NSIS打包

    一 Qt发布方式 Qt发布的时候 通常使用两种方式 1 静态编译 把相关联的库一并引入可执行程序 虽然发布简单 但可执行程序较大 2 动态编译 把相关联的库 以dll的形式引用 不包含到可执行程序 发布不方便 但可执行程序较小 二 NSIS
  • leectode 合并二叉树 -- 递归

    0 题目描述 leetcode原题链接 617 合并二叉树 1 递归解法 可以使用深度优先搜索合并两个二叉树 从根节点开始同时遍历两个二叉树 并将对应的节点进行合并 两个二叉树的对应节点可能存在以下三种情况 对于每种情况使用不同的合并方式
  • 梯度下降(Gradient Descent)

    基本思想 梯度下降是一个用来求函数最小值的算法 本次 我们将使用梯度下降算法来求出代价函数的最小值 梯度下降背后的思想是 开始时我们随机选择一个参数的组合 计算代价函数 然后我们寻找下一个能让代价函数值下降最多的参数组合 我们持续这么做直到
  • Vue2的学习

    computed计算属性 概念 基于现有数据 计算出来的新属性 依赖的数据变化 会自动重新计算 语法 声明在computed配置项中 一个计算属性对应一个函数 这是一个属性 计算属性名 不是方法 注意不要忘记return div ul li
  • 抓取热门话题:获取热门话题及其讨论

    目录 1 抓取微博热门话题简介 2 准备工作 3 分析微博网站结构 4 编写微博热门话题爬虫
  • 【程序员面试金典】对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。

    题目描述 对于一个元素各不相同且按升序排列的有序序列 请编写一个算法 创建一棵高度最小的二叉查找树 给定一个有序序列int vals 请返回创建的二叉查找树的高度 class MinimalBST public int buildMinim
  • 简单的融合模型:基于keras 的少量样本集迁移学习 VGG16+MeanShift+PAC降维混合模型的苹果识别

    案例分析 更多是是一种思想 而不是具体实现 1 数据集 样本总数为30个 其中普通苹果和其他苹果各占一半 其中有10个苹果已经标注其他均无标签 2 数据集扩容 由于数据集中数据数量少无法满足模型训练 故而改变图片生成一部分模型 path o
  • 翻转字符串

    描述 写出一个程序 接受一个字符串 然后输出该字符串反转后的字符串 字符串长度不超过1000 示例1 输入 abcd 返回值 dcba 示例2 输入 返回值 法一 使用StringBulider public String solve St

随机推荐

  • UML实例

    以下内容摘自张海藩老师 软件工程导论 课件 UML实例 拟开发一软件 完成学校管理中的教务部门功能 包括班级管理 课程管理 帐户管理等 要求用UML建模 1 用例图设计 主用例图 班级管理子用例图 帐户管理子用例图 2 顺序图和用例图 可为
  • echarts图形销毁重新绘制

    echars在绘制图形的时候会给div添加属性 echarts instance 因此只需要将此属性移除并清空div内容即可重新绘制新的echarts图形 myChart removeAttr echarts instance empty
  • libevent库使用之二:深入理解使用

    目录 一 event base 1 创建event base 2 查看IO模型 3 销毁event base 4 事件循环 event loop 5 event base的例子 二 event 事件 1 创建一个事件event 2 释放ev
  • IE9下silverlight 里边MessageBox.Show 失效!

    今天刚刚安装了IE9 在用的时候发现之前用silverlight 做的一个页面里边 MessageBox Show 执行后看不到弹出的对话框 整个页面卡在哪儿没反应了 测试了一下发现是因为silverlight 所在的页面 是用 javas
  • 迁移wind to linux服务器EE网站--迁移说明步骤

    1 上传程序文件 htaccess上传 里面有特殊字符记得更改2 还原数据库从原数据库导出 SQL的命令mysqldump u用户名 p密码 default character set latin1 数据名 gt 数据名 sql3 修改配置
  • 用CSS画小猪佩奇,你就是下一个社会人!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 作者 江志耿 腾讯TEG网络工程师 我是佩奇 哼 这是我的弟弟乔治 呱呱 这是我的妈妈 嚯 这是我的爸爸 嚯 背景 小猪佩奇已经火了好一阵了 其实一开始我是不屑的 纵观小朋友的历届动
  • 网络安全-子域名收集

    本文为作者学习文章 按作者习惯写成 如有错误或需要追加内容请留言 不喜勿喷 本文为追加文章 后期慢慢追加 子域名 子域名指二级域名 二级域名是顶级域名 一级域名 的下一级比如mail heetian com和bbs heetian com是
  • Fusionstorage Cinder架构

    由于最近一个月加班开发一个云存储产品 fusionstorage cinder 之前也没有碰过云存储这方面的知识 于是花了很长一段时间去学习了解它的架构 首先我们要知道云存储是什么 云存储其实是在云计算概念上延伸出的一个新概念 通过集群应用
  • 创建线程四种方法详解;及说明ThreadPoolExecutor方式创建线程池

    一 继承Thread类的方式 创建一个线程 class MyThred extends Thread public MyThred String name super name Override public void run 线程内的操作
  • Files under the build folder are generated and should not be edited

    在类库里面写的 按ctrl z返回之前写的代码 然后rebuild project的时候就不行了 报资源文件错误 各种clean也不起作用 报的错误都是build文件下的错误 应该是没更新过来 然后我就 1 show history返回到没
  • sklearn.svm中LinearSVR(svm线性回归)、LinearSVC(svm线性分类)与SVC(svm分类)、SVR(svm回归)之间的区别

    区别 LinearSVC SVM线性分类器 用来实现线性的分类任务 鸢尾花数据集 执行一个分类问题 import numpy as np from sklearn pipeline import Pipeline from sklearn
  • AI大模型公开课来了!免费学习!

    Datawhale分享 课程 知乎AI大模型公开课 近几年AI发展迅猛 行业巨头争先布局AI领域 想切入大热的AI领域 却找不到方向 为了帮助大家零成本学习AI大模型技术 特邀一线大佬发起 AI大模型公开课 AI大模型进阶之旅 直播时间 9
  • 蓝桥杯单片机学习5——外部中断

    上期我们学习了独立按键 矩阵按键 这次我们来学习外部中断 蓝桥杯单片机学习 外部中断 中断 1 中断请求源 2 外部中断 3 中断寄存器 4 中断优先级 5 中断结构 6 中断函数 6 中断嵌套 实战环节 1 任务要求 2 代码实现 3 代
  • 伽罗华域GF,GF(256)来源

    Galois Field 1 域 2 域中单位元和逆元 3 有限域GF p p p 4 有限域GF
  • Element ui多选框实现单选且隐藏全选按钮

    添加表格多选框列
  • Solidworks导出URDF总结(Noetic)

    环境 Solidwoks2018 SP0 Solidwoks2021 SP5 Ubuntu20 04 ROS1 Noetic Solidwoks2018 SP0对于平移副有问题 显示不出来 Solidwoks2021 SP5没有问题 官网有
  • windows bat批量创建文件夹与文件

    一 新建bat文件 批量创建 bat echo off for f i in nameList txt do mkdir i copy muban docx i i docx do mkdir i copy muban docx i i d
  • JDK历史所有版本下载地址(附Oracle帐号)

    由于有时在新的电脑或者服务器上需要安装新的JDK 但现在下载JDK已经没有之前方便了 需要登录才能下载 今天在这里我就来把jdk所有的版本下载地址与帐号列出来 方便大家下载 JDK所有版本下载地址 Java SE 14 Java SE 13
  • 逆向工具常用操作

    IDA 加载文件 Windows 下 用IDA加载文件之后 会在文件同目录下生成几个文件 id0 二叉树数据库 id1 文件包含描述每个程序字节的标志 nam 包含IDA Name 窗口的数据库 til 本地数据库有关信息 常用快捷键 快捷
  • 1120 哈夫曼树的创建遍历查找当前节点的编码

    package com import java util ArrayList import java util Collections import java util LinkedList import java util Stack 类