huffman树java_HuffmanTree - java实现

该思想借鉴于《2019版数据结构高分笔记(c语言版)》- 第7版

最近事多,有时间会把思路在这里阐述一下

代码思路如下/*

*

* add() 输入names[] weights[]

* sort()排序

* generateTree()生成树

* preOrder() 先序遍历生成节点编码code

* inOrder() 前序遍历输出编码

*

* root

* / \

* B tem

* / \

* D tem

* / \

* C tem

* / \

* A tem

* / \

* E F

* */代码如下package COURSE;

import java.util.LinkedList;

public class HuffmanTree {

private class Node {

E data;

double weight;

Node left, right;

String code = null;

// 叶子节点

public Node(E data, double weight) {

this.data = data;

this.weight = weight;

left = null;

right = null;

}

// 中间节点

public Node(Node left, Node right) {

this.data = null;

this.weight = left.weight + right.weight;

this.left = left;

this.right = right;

}

@Override

public String toString() {

StringBuilder res = new StringBuilder();

res.append("(data = ").append(data).append(", weight = ").append(weight).append("," + "code=").append(code).append(")");

return res.toString();

}

}

int size;

Node root;

LinkedList nodes = new LinkedList<>();

private String nodeCode = ""; // 左0 右1

public HuffmanTree() {

size = 0;

root = null;

}

// 添加: 批量添加

public void add(Character[] names, Double[] weights) {

for (int i = 0; i < names.length; i++) {

add((E) names[i], weights[i]);

}

}

private void add(E data, double weight) {

Node node = new Node(data, weight);

nodes.add(node);

size++;

}

// 排序

private void sort() {

LinkedList newNodes = new LinkedList<>();

while (!nodes.isEmpty()) {

int index = 0;

for (int i = 0; i < nodes.size(); i++) {

if (nodes.get(index).weight < nodes.get(i).weight) {

index = i;

}

}

newNodes.add(nodes.remove(index));

}

nodes = newNodes;

System.out.print("排序结果为");

System.out.println(nodes);

}

// 生成树

private void generateTree() {

Node min1 = nodes.removeLast();

Node min2 = nodes.removeLast();

Node temNode = new Node(min1, min2);

while (!nodes.isEmpty()) {

Node minNode = nodes.removeLast();

temNode = new Node(minNode, temNode);

}

this.root = temNode;

}

// 私有:前序遍历 + 编码

private void preOrder(Node node) {

Node cur = node;

if (cur.left != null) {

nodeCode = nodeCode + "0";

preOrder(cur.left);

}

if (cur.right != null) {

nodeCode = nodeCode + "1";

preOrder(cur.right);

}

if (cur.left == null && cur.right == null && cur.data != null) {

cur.code = nodeCode;

System.out.println("节点" + cur.data + "的编码为" + cur.code);

nodeCode = nodeCode.substring(0,nodeCode.length() -1);

return;

}

}

// 中序遍历

public void inOrder() {

sort(); // 排序

generateTree(); // 生成树

preOrder(root);// 编码

inOrder(root); // 遍历

}

// 私有 : 中序遍历递归

private void inOrder(Node node) {

if (node == null) {

return;

}

inOrder(node.left);

if (node.data != null) {

System.out.println(node);

}

inOrder(node.right);

}

public static void main(String[] args) {

Character[] names = {'A', 'B', 'C', 'D', 'E', 'F'};

Double[] weights = {15.0, 30.0, 20.0, 25.0, 3.0, 7.0};

HuffmanTree huffmanTree = new HuffmanTree();

huffmanTree.add(names, weights);

huffmanTree.inOrder();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java crontriggerbean_java – 使用JobStoreTX为石英聚类配置CronTriggerFactoryBean

我们正在使用Quartz 2.1.5;我们设置了以下属性&#xff1a;org.quartz.jobStore.classorg.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClassorg.quartz.impl.jdbcjobstore.CloudscapeDelegateorg.quartz.jobStore.useProperties trueorg.quartz.j…

利用文本文档运行java程序_java代码创建文件夹和读取文本文件txt的内容(可运行)...

java代码创建文件夹和读取文本文件txt的内容(可运行)读取txt 的内容 和 创建一个 新的文件夹package com.sec.file;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;public class ReaderFile {public static void main(String[] args) throws Ex…

java ssh 那一层应该捕获异常_java ssh异常(大神来看看啊)

提一个小问题呢&#xff01;ssh框架整合时 我看别人的代码都不对异常做处理&#xff0c;这是为什么呢 如不比如Dao操作数据库的代码中都没用throws异常,那service层中的应该是取不到抛出的异常才对啊&#xff0c;那这样在service层事务的交给Spring来管理的service层取不到异常…

java web 润乾报表教程_润乾报表开发 基础教程.ppt

润乾报表开发 ——基础教程 主格和附属格 单元格进行扩展的过程中&#xff0c;缺省情况下&#xff0c;相对于其右(下)边的单元格而言&#xff0c;扩展格是主动复制的&#xff0c;被称为其它格(其右/下的格)的主格&#xff0c;而其右(下)的单元格是被动跟随复制的&#xff0c;被…

java 布尔逻辑运算符_Java运算符

Java语言提供许多操作符。操作符是特殊的符号(symbol)&#xff0c;它对一个或者两个、三个的操作数进行运算&#xff0c;然后返回一个结果&#xff0c;最简单的就像我们一年级学到的 -号。一般地&#xff0c;可以将运算符分为四大类&#xff1a;算数运算符、位运算符、关系运算…

java7 异常继承_Java基础7-异常;jar包

使用接口进行如下程序设计个人电脑(PC)具有PCI插槽&#xff0c;可以插入PCI卡。显卡、声卡、语音卡都可以作为PCI卡插入PCI插槽中PC,PCI,slot,VideoCard,SoundCard, VoiceCardinterface PCI{public void pci();}class VideoCard implements PCI{public void pci(){System.out.p…

Java自动化获取页面主题_基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍

1. 启动浏览器前边有详细介绍启动三种浏览器的方式(IE、Chrome、Firefox)&#xff1b;private WebDriver driver null;private String chromeDriverDir "D:\\workspace\\A_Test\\resource\\chromedriver.exe";/*** 打开谷歌浏览器&#xff1b;*/public void openCh…

java字符串压缩js解压_接口实现后台GZIP压缩,pako.js 前端解压

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class GZIPUtils {/*** 字符串的压缩** param str* 待压缩的字符串* return 返回…

java list初始值null_关于list集合存储null的问题

工作中&#xff0c;遇到list集合存储null的问题&#xff0c;不确定list能否存储null值。于是写一些demo测试list&#xff0c;set,table,及map存储null的问题。1.list之arraylist1 public static voidmain(String[] args) {2 String string null;3 List list new ArrayList();4 …

js java 反射机制_java 类加载机制和反射机制

一.类的加载机制jvm把class文件加载到内存&#xff0c;并对数据进行校验、解析和初始化&#xff0c;最终形成jvm可以直接使用的java类型的过程。(1)加载将class文件字节码内容加载到内存中&#xff0c;并将这些静态数据转换成方法区中的运行时数据结构&#xff0c;在堆中生成一…

java fx输出_JavaFX中具有输入和输出参数的并发后台任务或服务

宁愿这是一个非常简单的概念,但是由于我对JavaFX的并发性完全陌生.我一直在努力理解这个概念.在构建一个非常简单的JavaFX应用程序时,我想在后台执行一些冗长的任务,并使UI免受冻结.在下面的示例中,我试图创建一个简单的后台任务服务,然后使用ControlsFX Dialog在主UI窗口上显示…

pod 挂载点 mysql_Pod挂载(Secret )

一种特殊的Volume&#xff1a; Projected Volume &#xff0c;你可以把它翻译为“投射数据卷”。Ps&#xff1a;Projected Volume 是 Kubernetes v1.11 之后的新特性在 Kubernetes 中&#xff0c;有几种特殊的 Volume&#xff0c;它们存在的意义不是为了存放容器里的数据&#…

lambda 流 peek java_JDK8 流与λ表达式

λ表达式什么是λ表达式λ表达式有三部分组成&#xff1a;参数列表&#xff0c;箭头(->)&#xff0c;以及一个表达式或者语句块。public int add(int x, int y) {return x y;}转换为λ表达式(int x, int y) -> x y;去除参数类型(x, y) -> x y;无参 以及 只有一个参…

理解java虚拟机工作后了解吗_JAVA入门到再次入门——深入理解JAVA虚拟机(二)|七日打卡...

前言为什么叫做入门到到再次入门请参考前一篇或个人博客&#xff0c;在此不再赘述&#xff0c;嗯哼&#xff0c;了解了JVM的基本运行流程以及内存结构&#xff0c;算是初步认识了JVM&#xff0c;跟着课本往前走&#xff0c;继续了解根据JVM的内存模型探索java当中变量的可见性以…

java访问错误404_如何解决 Java web 项目中的 404 错误

在使用 Tomcat 进行 Java Web 开发的时候&#xff0c;经常会遇到以下 HTTP 404 错误&#xff1a;错误代码为 HTTP 404(未找到)&#xff0c;描述信息是&#xff1a;“The origin server did not find a current representation for the target resource or is not willing to di…

java double 的精度_Java Double的精度问题

Java.text类 DecimalFormatjava.lang.Objectjava.text.Formatjava.text.NumberFormatjava.text.DecimalFormatvoid setMaximumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最大数字位数。void setMinimumFractionDigits(int newValue) …

java餐饮管理系统图片,基于jsp的酒店餐饮管理系统-JavaEE实现酒店餐饮管理系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的酒店餐饮管理系统, 该项目可用各类java课程设计大作业中, 酒店餐饮管理系统的系统架构分为前后台两部分, 最终实现在线上进行酒店餐饮管理系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类酒店餐饮管…

php 验证码一直不对,ThinkPHP验证码老是出错怎么办

ThinkPHP验证码老是出错的解决办法&#xff1a;1、找到服务器php配置文件php.ini在网站根目录下建一个info.php文件。例如&#xff1a;D:\wwwRoot\wp 这个是网站的根目录&#xff0c;在此目录下&#xff0c;新建一个txt文档&#xff0c;输入如下代码&#xff1a;然后另存为info…

小皮面板有php环境吗,体验phpStudy小皮面板创建LAMP/LNMP系统和建站图文

在国庆节后老 左有看到原phpStudy面板新的Linux面板系统更新发布取名小皮面板(phpStudy Linux系统初次体验 – 一键安装phpStudy面板查看功能)&#xff0c;初次体验这款面板之后我们肯定会会当前比较热门的宝塔面板作为比较&#xff0c;有些人说UI和功能上有所参考&#xff0c;…

php 断点续传 暂停,PHP 断点续传实例详解

在做一个案例&#xff0c;要给客户端做断点续传的服务&#xff0c;断点续传主要是HTTP协议中的Content-Range报头。其理解如下&#xff1a;Content-Range&#xff1a;响应资源的范围。可以在多次请求中标记请求的资源范围&#xff0c;在连接断开重新连接时&#xff0c;客户端只…