华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现
2025 A卷 100分 题型
本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!
本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》
华为OD机试真题《生成哈夫曼树》:
目录
- 题目名称:生成哈夫曼树
- 题目描述
- Java
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 输入1:
- 输入2:
- 输入3:
- 综合分析
- python
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 输入1:
- 输入2:
- 输入3:
- 综合分析
- JavaScript
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
- C++
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 输入1:
- 输入2:
- 输入3:
- 综合分析
- C语言
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 输入1:
- 输入2:
- 输入3:
- 综合分析
- GO
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 示例1输入:
- 示例2输入:
- 示例3输入:
- 综合分析
题目名称:生成哈夫曼树
- 知识点:哈夫曼树、优先队列
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
给定长度为 n 的无序数字数组,每个数字代表二叉树的叶子节点权值(所有值 ≥ 1)。请根据输入生成哈夫曼树,并输出其中序遍历结果。要求满足以下限制条件:
- 节点权值规则:左节点权值 ≤ 右节点权值,根节点权值为左右子节点权值之和。
- 高度规则:若左右节点权值相同,左子树高度 ≤ 右子树高度。
输入描述
- 第一行为整数 n(表示叶子节点数量,1 ≤ n ≤ 1e5)。
- 第二行为 n 个正整数,表示每个叶子节点的权值。
输出描述
- 输出中序遍历结果,数值间以空格分隔。若无有效树,返回空数组(用例保证输入有效)。
示例
输入:
5
5 15 40 30 10
输出:
40 100 30 60 15 30 5 15 10
说明:
- 生成的哈夫曼树带权路径最短,如示例中总路径长度为:40×1 + 30×2 + 15×3 + 5×4 + 10×4 = 205。
- 中序遍历结果需满足左节点权值 ≤ 右节点,且权值相同时左子树高度更低。
补充说明:
- 哈夫曼树构造需通过优先队列(小顶堆)合并最小权值节点,直至只剩一个根节点。
- 时间复杂度需为 O(n log n),空间复杂度 O(n)。
Java
问题分析
我们需要根据给定的权值数组构建哈夫曼树,并输出其中序遍历结果。哈夫曼树的构建需要满足:
- 权值规则:左节点的权值 ≤ 右节点的权值。
- 高度规则:权值相同时,左子树的高度 ≤ 右子树的高度。
- 高效构造:使用优先队列(小顶堆)合并最小权值节点,时间复杂度为 O(n log n)。
解题思路
- 优先队列初始化:将每个权值初始化为叶子节点,按权值从小到大排列,权值相同时按高度从小到大排列。
- 构建哈夫曼树:
- 每次从队列取出两个最小节点,合并为新节点。
- 新节点的权值为子节点之和,高度为较大子树高度加一。
- 根据权值规则和高度规则确定左右子节点顺序。
- 中序遍历:使用非递归方式遍历树,按左 → 根 → 右顺序收集权值。
代码实现
import java.util.*;public class Main {static class Node {int weight;Node left;Node right;int height;// 叶子节点构造函数public Node(int weight) {this.weight = weight;this.height = 0; // 叶子节点高度为0}// 合并生成父节点的构造函数public Node(Node left, Node right) {this.left = left;this.right = right;this.weight = left.weight + right.weight;this.height = Math.max(left.height, right.height) + 1;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();List<Integer> weights = new ArrayList<>();for (int i = 0; i < n; i++) {weights.add(scanner.nextInt());}// 优先队列:按权值从小到大,权值相同时按高度从小到大PriorityQueue<Node> queue = new PriorityQueue<>((a, b) -> {if (a.weight != b.weight) {return a.weight - b.weight;} else {return a.height - b.height;}});// 初始化队列,所有叶子节点入队for (int w : weights) {queue.add(new Node(w));}// 合并节点,构建哈夫曼树while (queue.size() > 1) {Node left = queue.poll();Node right = queue.poll();Node parent = new Node(left, right); // 自动满足左 ≤ 右queue.add(parent);}// 中序遍历Node root = queue.poll();List<Integer> result = new ArrayList<>();Deque<Node> stack = new LinkedList<>();Node current = root;// 非递归中序遍历while (current != null || !stack.isEmpty()) {while (current != null) {stack.push(current);current = current.left;}current = stack.pop();result.add(current.weight);current = current.right;}// 输出结果StringBuilder sb = new StringBuilder();for (int num : result) {sb.append(num).append(" ");}if (sb.length() > 0) {sb.deleteCharAt(sb.length() - 1);}System.out.println(sb);}
}
代码详细解析
-
Node 类:
weight
:节点权值。left
和right
:左右子节点。height
:节点高度,叶子节点为0,父节点为子节点最大高度加一。
-
优先队列初始化:
- 自定义比较器,先按权值排序,权值相同时按高度排序。
- 将所有叶子节点加入队列。
-
合并节点:
- 循环取出两个最小节点,合并为新节点。
- 新节点的左右顺序由队列比较器自动保证(权值小者优先,权值相同高度小者优先)。
-
中序遍历:
- 使用栈模拟递归,按左 → 根 → 右顺序遍历所有节点。
- 收集所有节点的权值到结果列表。
-
输出处理:
- 将结果列表转换为字符串格式,确保末尾无空格。
示例测试
输入1:
5
5 15 40 30 10
输出:
40 100 30 60 15 30 5 15 10
解析:合并顺序确保所有条件满足,中序遍历结果正确。
输入2:
2
3 5
输出:
3 8 5
解析:合并生成父节点8,中序遍历顺序为3 → 8 → 5。
输入3:
1
5
输出:
5
解析:单个叶子节点,直接输出自身权值。
综合分析
- 时间复杂度:O(n log n)。
- 优先队列的插入和删除操作均为 O(log n),共执行 O(n) 次。
- 空间复杂度:O(n)。
- 存储哈夫曼树需要 O(n) 空间,优先队列和中序遍历栈均为 O(n)。
- 优势:
- 高效合并:优先队列确保每次合并选择最小权值节点。
- 自动排序:比较器自动处理权值和高度规则,确保树结构正确。
- 适用场景:大规模数据处理,符合题目要求的 O(n log n) 时间复杂度和 O(n) 空间复杂度。
python
问题分析
我们需要根据给定的权值数组构建哈夫曼树,并输出其中序遍历结果。哈夫曼树的构建需满足:
- 权值规则:左节点权值 ≤ 右节点权值。
- 高度规则:权值相同时,左子树高度 ≤ 右子树高度。
- 高效构造:使用优先队列(小顶堆)合并最小节点,时间复杂度为 O(n log n)。
解题思路
- 优先队列初始化:将每个权值初始化为叶子节点,按权值从小到大排列,权值相同时按高度从小到大排列。
- 构建哈夫曼树:
- 每次从队列取出两个最小节点,合并为新节点。
- 新节点的权值为子节点之和,高度为较大子树高度加一。
- 中序遍历:使用栈模拟递归遍历,按左 → 根 → 右顺序收集权值。
代码实现
import heapqclass Node:def __init__(self, weight, left=None, right=None):self.weight = weightself.left = leftself.right = right# 计算节点高度:叶子节点高度为0,父节点高度为子节点最大高度+1if left is None and right is None:self.height = 0else:self.height = max(left.height, right.height) + 1# 定义节点比较规则:先比权值,权值相同比高度def __lt__(self, other):if self.weight != other.weight:return self.weight < other.weightelse:return self.height < other.heightdef main():n = int(input())weights = list(map(int, input().split()))if n == 0:print("")return# 初始化优先队列heap = []for w in weights:heapq.heappush(heap, Node(w))# 合并节点直到只剩根节点while len(heap) > 1:left = heapq.heappop(heap)right = heapq.heappop(heap)# 创建父节点,自动满足左≤右的规则parent = Node(left.weight + right.weight, left, right)heapq.heappush(heap,
相关文章:

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…...

大厂前端研发岗位设计的30道Webpack面试题及解析
文章目录 一、基础核心二、配置进阶三、性能优化四、Loader原理五、Plugin机制六、高级应用七、工程化实战八、原理深挖九、异常处理十、综合场景一、基础核心 Webpack的核心概念是什么? 解析:入口(entry)、输出(output)、加载器(loader)、插件(plugins)、模式(mode)。Loader…...

Oracle中EXISTS NOT EXISTS的使用
目录 1.IN与EXISTS EXISTS用法总结 2.NOT IN与NOT EXISTS 3.not in 中 null的用法 4.EXISTS和IN的区别 (面试常问) 1.IN与EXISTS 示例:在 DEPT 表中找出在 EMP 表中存在的部门编号; 方法一:使用in select DEPTNO from DEPT where D…...

01.认识Kubernetes
什么是Kubernets 套用官方文档对Kubernetes的定义,翻译成中文的意思是: Kubernetes,也称为k8,是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器分组为逻辑单元,以便于管理和发现…...
基于AI生成测试用例的处理过程
基于AI生成测试用例的处理过程是一个结合机器学习、自然语言处理(NLP)和领域知识的系统性流程。以下是其核心步骤和关键技术细节,以帮助理解如何利用AI自动化生成高效、覆盖全面的测试用例。 1. 输入分析与需求建模 目标 将用户需求、系统文…...

【PostgreSQL 02】PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来
PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来 关键词 PostgreSQL高级数据类型, JSONB, 数组类型, PostGIS, 地理信息系统, NoSQL, 文档数据库, 空间数据, 数据库设计, PostgreSQL扩展 摘要 PostgreSQL的高级数据类型是其区别于传统关系数据库的核心…...

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!
在数字化时代,PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲,大家对PDF文件的操作需求日益增加。因此,一款出色的PDF处理软件不仅要满足多样化的需求,还要通过简洁的界面和强大的功能…...
tmux基本原理
目录 **一、核心架构:客户端-服务器模型****二、终端虚拟化:伪终端(PTY)****三、会话持久化原理****四、窗格分割的实现****五、关键系统调用****六、与传统终端对比****七、典型工作流示例****总结** tmux(Terminal M…...
RAGFlow从理论到实战的检索增强生成指南
目录 前言 一、RAGFlow是什么?为何需要它? 二、RAGFlow技术架构拆解 三、实战指南:从0到1搭建RAGFlow系统 步骤1:环境准备 步骤2:数据接入 步骤3:检索与生成 四、优化技巧:让RAGFlow更精…...
【Java】ForkJoin 框架
在Java中,ForkJoin框架是并行编程的一个重要工具,它主要用于处理可以分解为多个子任务的复杂任务。ForkJoin框架的核心是ForkJoinPool,它是一个线程池,专门用于执行ForkJoinTask任务。通过将大任务分解为多个小任务,并…...
PHP实战:安全实现文件上传功能教程
HTML部分: <form action"upload.php" method"post" enctype"multipart/form-data"> <input type"file" name"userfile"> <input type"submit" value"上传"> <…...

桥 接 模 式
在玩游戏的时候我们常常会遇到这样的机制:我们可以随意选择不同的角色,搭配不同的武器。这时只有一个抽象上下文的策略模式就不那么适用了,因为一旦我们使用继承的方式,武器和角色总有一方会变得难以扩展。这时,我们就…...

基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路
摘要:本文整理自淘天集团高级数据开发工程师朱奥老师在 Flink Forward Asia 2024 流式湖仓论坛的分享。内容主要为以下五部分: 1、项目背景 2、核心策略 3、解决方案 4、项目价值 5、未来计划 01、项目背景 1.1 当前实时数仓架构 当前的淘天实时架构是从…...

多杆合一驱动城市空间治理智慧化
引言:城市“杆林困境”与智慧化破局 走在现代城市的街道上,路灯、监控、交通信号灯、5G基站等杆体林立,不仅侵占公共空间,更暴露了城市治理的碎片化问题。如何让这些“沉默的钢铁”升级为城市的“智慧神经元”?答案在…...

用QT写一个车速表
主要包含以下绘制步骤: 1、绘制画布: /** 绘制画布 */ void Widget::initCanvas(QPainter &painter) {//消除锯齿painter.setRenderHint(QPainter::Antialiasing,true);//设置底色painter.setBrush(QColor(0,0,0));painter.drawRect(rect());//平移…...
(19)java在区块链中的应用
🔗 Java在区块链中的应用:智能合约开发全攻略 TL;DR: Java在区块链领域主要通过Hyperledger Fabric、Web3j和专用JVM实现智能合约开发,相比Solidity具有更强的企业级支持和开发效率,但在执行效率和Gas消耗方面存在差异,…...

数控技术应用理实一体化平台VR实训系统
::产品概述:: 目前我国本科类院校学生普遍存在的问题就是缺少对实际工作的了解,一直在学习相关专业的理论知识,对社会的相关企业的用人情况不了解。这也就直接导致了毕业的学生和社会上的用人单位需求有点脱节,这也是由于我国的现行本科教育侧…...

C# 将HTML文档、HTML字符串转换为图片
在.NET开发中,将HTML内容转换为图片的需求广泛存在于报告生成、邮件内容存档、网页快照等场景。Free Spire.Doc for .NET作为一款免费的专业文档处理库,无需Microsoft Word依赖,即可轻松实现这一功能。本文将深入解析HTML文档和字符串转图片两…...

界面控件DevExpress WinForms v24.2新版亮点:富文本编辑器功能全新升级
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...

华为云Flexus+DeepSeek征文|华为云 Flexus X 加速 Dify 平台落地:高性能、低成本、强可靠性的云上选择
目录 前言 1 一键部署 Dify 平台的完整步骤 1.1 选择模板 1.2 参数配置 1.3 资源栈设置 1.4 配置确认与部署 2 Flexus X 服务器的技术优势 2.1 柔性算力随心配 2.2 一直加速一直快 2.3 越用越省降本多 2.4 安全可靠更放心 3 Flexus X 在 Dify 解决方案中的性能体验…...

Jenkins 2.479.1安装和邮箱配置教程
1.安装 在JDK安装并设置环境变量完成后,下载官网对应的war版本,在对应目录下打开命令行窗口并输入 java -jar jenkins.war其余参数感兴趣可以自行查阅,这里启动的 jenkins 服务默认占用8080端口,在浏览器输入 localhost:8080进入…...
MySQL 大战 PostgreSQL
一、底层架构对比 维度MySQLPostgreSQL存储引擎多引擎支持(InnoDB、MyISAM等)单一存储引擎(支持扩展如Zheap、Zedstore)事务实现基于UNDO日志的MVCC基于堆表(Heap)的MVCC锁机制…...

DFS入门刷题c++
目录 821. 跳台阶 - AcWing题库 92. 递归实现指数型枚举 - AcWing题库 P1706 全排列问题 - 洛谷 (luogu.com.cn) P1157 组合的输出 - 洛谷 (luogu.com.cn) P1036 [NOIP 2002 普及组] 选数 - 洛谷 (luogu.com.cn) P2089 烤鸡 - 洛谷 (luogu.com.cn) P1088 [NOIP 2…...

ToolsSet之:十六进制及二进制编辑运算工具
ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Number菜单下的Hex Operate工具可以进…...
服务器液冷:突破散热瓶颈,驱动算力革命的“冷静”引擎
在人工智能大模型训练、高性能计算和超密集数据中心爆发的时代,CPU/GPU芯片的功耗已突破千瓦大关,传统风冷散热捉襟见肘。液冷技术正从实验室走向数据中心核心,成为解锁更高算力密度的关键钥匙。本文将深度解析液冷技术的原理、方案与应用。 …...
1.2 HarmonyOS NEXT分布式架构核心技术解析
HarmonyOS NEXT分布式架构核心技术解析 在数字化浪潮中,HarmonyOS NEXT以其卓越的分布式架构,重塑了设备间协同交互的格局,为开发者开拓出全新的应用设计思路。本章节将深入剖析HarmonyOS NEXT分布式架构的三大核心技术,助力开发…...

【Python训练营打卡】day40 @浙大疏锦行
DAY 40 训练和测试的规范写法 知识点回顾: 1. 彩色和灰度图片测试和训练的规范写法:封装在函数中 2. 展平操作:除第一个维度batchsize外全部展平 3. dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropo…...

MCP Server的五种主流架构:从原理到实践的深度解析
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在AI大模型与外部数据交互的浪潮中,MCP Server(Model Context Protocol Server)已成为连接模型与现实世界的桥梁。本文…...

跨协议协同智造新实践:DeviceNet-EtherCAT网关驱动汽车焊接装配效能跃迁
在汽车制造领域,机器人协作对于提升生产效率与产品质量至关重要。焊接、装配等关键环节,需要机器人与各类设备紧密配合。JH-DVN-ECT疆鸿智能的devicenet从站转ethercat主站协议网关,成为实现这一高效协作的得力助手,尤其是在连接欧…...
在Linux上安装Docker并配置镜像加速器:从入门到实战
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 Docker作为容器化技术的标杆工具,已经成为现代软件开发和运维的必备技能。对于程序员和技术爱好者来说,在Linux系统上搭建D…...