使用java构建一个哈夫曼树

使用java构建一个哈夫曼树

1. 定义节点类,表示哈夫曼树中的一个节点

代码:

class Node implements Comparable<Node> {char ch; // 字符int freq; // 频率Node left, right; // 左右子节点// 节点构造函数public Node(char ch, int freq, Node left, Node right) {this.ch = ch;this.freq = freq;this.left = left;this.right = right;}// 按频率比较节点@Overridepublic int compareTo(Node other) {return this.freq - other.freq;}
}

2. 构建哈夫曼树的方法
    public static Node buildHuffmanTree(char[] chars, int[] freq) {// 优先队列用于存储节点并按频率排序PriorityQueue<Node> pq = new PriorityQueue<>();// 创建节点并加入优先队列for (int i = 0; i < chars.length; i++) {pq.offer(new Node(chars[i], freq[i], null, null));}// 合并频率最低的节点构建哈夫曼树while (pq.size() > 1) {Node left = pq.poll();Node right = pq.poll();Node parent = new Node('\0', left.freq + right.freq, left, right);pq.offer(parent);}// 返回哈夫曼树的根节点return pq.poll();}

3. 主方法用于演示构建哈夫曼树
    public static void main(String[] args) {// 输入字符和频率char[] chars = {'a', 'b', 'c', 'd', 'e'};int[] freq = {3, 2, 4, 2, 1};// 构建哈夫曼树Node root = buildHuffmanTree(chars, freq);// 打印哈夫曼树结构printTree(root, "", true);System.out.println("Huffman Tree built successfully!");}

4. 递归打印哈夫曼树结构的方法
    public static void printTree(Node root, String prefix, boolean isLeft) {if (root != null) {System.out.println(prefix + (isLeft ? "├── " : "└── ") + root.ch + "(" + root.freq + ")");printTree(root.left, prefix + (isLeft ? "│   " : "    "), true);printTree(root.right, prefix + (isLeft ? "│   " : "    "), false);}}

5. 执行结果
├──  (12)
│   ├──  (5)
│   │   ├── b(2)
│   │   └──  (3)
│   │       ├── e(1)
│   │       └── d(2)
│   └──  (7)
│       ├── a(3)
│       └── c(4)
Huffman Tree built successfully!Process finished with exit code 0

功能总结:该代码实现了一个简单的哈夫曼树结构,包括构建哈夫曼树和打印哈夫曼树结构的功能。通过优先队列来按照频率构建哈夫曼树,然后递归地打印出哈夫曼树的结构。

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

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

相关文章

JRebel and XRebel 插件在IDEA中的安装、激活和使用

1、JRebel安装 1、打开idea->setting->plugins->Marketplace 2、搜索插件JRebel and XRebel&#xff0c;点击安装&#xff0c;然后重启idea 如果左侧出现JRebel & XRebel代表已安装 3.离线安装JRebel 根据自己安装的idea版本进行下载电影的jrebel https://plugi…

如何检测ssh暴力破解

Shell Shell是一种用来与操作系统交互的命令行界面(CLI)。它允许用户通过输入命令来控制计算机并执行各种操作。 在Linux和Unix系统中,常用的Shell有bash、csh、ksh等。在Windows系统中,常用的Shell有cmd和PowerShell。 早期的互联网,直接通过Shell通信都是明文通信,一旦…

Flutter 设置每帧绘制结束调用的回调函数

前言 Flutter是一个开源的UI软件开发工具包&#xff0c;由Google开发&#xff0c;用于创建跨平台的移动应用程序。Flutter框架通过每帧渲染画面的方式&#xff0c;提供了流畅的用户体验和高性能的应用。在开发过程中&#xff0c;我们经常遇到需要在渲染完成一帧后执行某些特定…

1.Zookeeper理论基础

1.Zookeeper的基本概念 是一个分布式应用协调框架 &#xff0c;java编写的。客户端 /服务端 的架构模式。CP设计(一致性&#xff0c;分区容错) 它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;服务注册服务、状态同步服务、集群管理、分布…

ALV Grid 函数

ALV Grid 函数的输出有两个&#xff1a;REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GRID_DISPLAY_LVC 两者的操作大同小异&#xff0c;只是后者能更好的和ALV容器结合使用&#xff0c;前后则不能&#xff1b;而在输入参数属性的结构上也有些差异。 本篇文章主要讲解下ALV函数中输入…

WordPress建站入门教程:忘记数据库名称、用户名和密码了怎么办?

有时候我们需要进入phpMyAdmin管理一些数据库&#xff0c;但是登录phpMyAdmin时却需要我们输入数据库的用户名和密码&#xff0c;但是我们不记得了应该怎么办呢&#xff1f; 其实&#xff0c;我们只需要进入WordPress网站根目录找到并打开wp-config.php文件&#xff0c;就可以…

vue2数据响应式原理解析

vue2与vue3区别浅析&#xff1a;vue2和vue3区别 浅析-CSDN博客 vue是mvvm框架&#xff0c;即“模型—视图—视图模型”&#xff0c;数据模式还是javascript对象&#xff0c;通过模型中应用程序数据和业务逻辑影响到视图的改变&#xff0c;视图(用户的操作)的改变会影响到底层数…

Git 进阶 高级用法,重要命令记录

本篇文章用于记录Git高级用法&#xff0c;新手可以看我的另一篇文章&#xff1a;Git基础教学。 Git git fetch 是git pull 的细分步骤&#xff0c;git pull 包含了git fetch git pull origin master 上述命令其实相当于git fetch git merge 在实际使用中&#xff0c;git fetc…

如何使用ArcGIS Pro进行坡度分析

坡度分析是地理信息系统中一种常见的空间分析方法&#xff0c;用于计算地表或地形的坡度&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro进行坡度分析&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&…

uniapp报错:request:fail abort statusCode:-1 Chain validation failed

uniapp报错信息记录 场景: 半年没碰过的app&#xff0c;今个儿突然无法登录了。 打开控制台&#xff0c;报错信息如下 {msg: request:fail abort statusCode:-1 Chain validation failed}奇怪的是用 apifox 调用相关的接口&#xff0c;可以正常运行&#xff0c;app却不行。 好…

防坑指南!说说Six Sigma咨询公司排名的那些事

在企业管理领域&#xff0c;六西格玛&#xff08;Six Sigma&#xff09;已成为一种流行的质量管理方法。然而&#xff0c;面对众多的Six Sigma咨询公司&#xff0c;如何选择一家真正专业、有实力的合作伙伴&#xff0c;成为了许多企业面临的难题。本文&#xff0c;天行健咨询将…

高级语言讲义2019计专(仅高级语言部分)

1.编写函数&#xff0c;对给定的整数数组a&#xff08;数组长度和元素个数均为N&#xff09;进行判定&#xff1a;是否存在某个整数a[i]&#xff08;0<i<N&#xff09;&#xff0c;等于在其之前的所有整数的和 #include <stdio.h> #include <stdbool.h>bool…

编写 Ansible Playbooks

简介 简而言之&#xff0c;服务器配置管理&#xff08;也被广泛称为 IT 自动化&#xff09;是将基础设施管理转化为代码库的解决方案&#xff0c;描述了部署服务器所需的所有流程&#xff0c;并将其转化为一组可以进行版本控制和轻松重复使用的配置脚本。它可以极大地提高任何…

在训练过程中,如何动态调整哪些层被冻结或解冻

在训练过程中动态调整哪些层被冻结或解冻通常涉及到在训练的不同阶段改变模型参数的requires_grad属性。这可以通过编写一个自定义的训练循环或者利用深度学习框架提供的回调函数&#xff08;callbacks&#xff09;来实现。以下是一些可能的方法&#xff1a; 自定义训练循环: 在…

JVM相关知识

JVM相关知识 &#x1f333;1.JVM概述&#x1fab4;1.1 JVM作用:&#x1fab4;1.2JVM构成&#x1fab4;1.3JVM整体结构图 &#x1f333;2.类加载子系统&#x1fab4;2.1作用&#x1fab4;2.2类加载过程&#x1f331;2.2.1加载:&#x1f331;2.2.2连接&#x1f331;2.2.3初始化 &…

浅谈 Vue3 静态提升和预字符串化

前言 很多朋友在看到 Vue3静态提升 的时候很不理解&#xff0c;不明白这句话到底是什么意思&#xff0c;今天我们就通过这篇日记来搞明白。如果有什么地方描述不正确&#xff0c;请多多指正。 静态类型&#xff08;前置信息&#xff09; 判断节点是否为静态类型&#xff0c;…

【BUUCTF Misc】通关 3.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

利用GPT开发应用001:GPT基础知识及LLM发展

文章目录 一、惊艳的GPT二、大语言模型LLMs三、自然语言处理NLP四、大语言模型LLM发展 一、惊艳的GPT 想象一下&#xff0c;您可以与计算机的交流速度与与朋友交流一样快。那会是什么样子&#xff1f;您可以创建哪些应用程序&#xff1f;这正是OpenAI正在助力构建的世界&#x…

Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明 独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现 相关界面包含关系 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #incl…

理解CPU指令执行:从理论到实践

理解CPU指令执行&#xff1a;从理论到实践 在探讨现代计算机的核心——中央处理单元&#xff08;CPU&#xff09;的工作原理时&#xff0c;我们经常遇到“时钟周期”和“指令执行”这两个概念。这些概念不仅对于理解CPU的性能至关重要&#xff0c;而且对于揭示计算机如何处理任…