华为OD机试真题——生成哈夫曼树(2025B卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

article/2025/6/18 18:35:48

在这里插入图片描述

2025 B卷 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)。请根据输入生成哈夫曼树,并输出其中序遍历结果。要求满足以下限制条件:

  1. 节点权值规则:左节点权值 ≤ 右节点权值,根节点权值为左右子节点权值之和。
  2. 高度规则:若左右节点权值相同,左子树高度 ≤ 右子树高度。

输入描述

  • 第一行为整数 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

问题分析

我们需要根据给定的权值数组构建哈夫曼树,并输出其中序遍历结果。哈夫曼树的构建需要满足:

  1. 权值规则:左节点的权值 ≤ 右节点的权值。
  2. 高度规则:权值相同时,左子树的高度 ≤ 右子树的高度。
  3. 高效构造:使用优先队列(小顶堆)合并最小权值节点,时间复杂度为 O(n log n)。

解题思路

  1. 优先队列初始化:将每个权值初始化为叶子节点,按权值从小到大排列,权值相同时按高度从小到大排列。
  2. 构建哈夫曼树
    • 每次从队列取出两个最小节点,合并为新节点。
    • 新节点的权值为子节点之和,高度为较大子树高度加一。
    • 根据权值规则和高度规则确定左右子节点顺序。
  3. 中序遍历:使用非递归方式遍历树,按左 → 根 → 右顺序收集权值。

代码实现

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);}
}

代码详细解析

  1. Node 类

    • weight:节点权值。
    • leftright:左右子节点。
    • height:节点高度,叶子节点为0,父节点为子节点最大高度加一。
  2. 优先队列初始化

    • 自定义比较器,先按权值排序,权值相同时按高度排序。
    • 将所有叶子节点加入队列。
  3. 合并节点

    • 循环取出两个最小节点,合并为新节点。
    • 新节点的左右顺序由队列比较器自动保证(权值小者优先,权值相同高度小者优先)。
  4. 中序遍历

    • 使用栈模拟递归,按左 → 根 → 右顺序遍历所有节点。
    • 收集所有节点的权值到结果列表。
  5. 输出处理

    • 将结果列表转换为字符串格式,确保末尾无空格。

示例测试

输入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  

解析:单个叶子节点,直接输出自身权值。


综合分析

  1. 时间复杂度:O(n log n)。
    • 优先队列的插入和删除操作均为 O(log n),共执行 O(n) 次。
  2. 空间复杂度:O(n)。
    • 存储哈夫曼树需要 O(n) 空间,优先队列和中序遍历栈均为 O(n)。
  3. 优势
    • 高效合并:优先队列确保每次合并选择最小权值节点。
    • 自动排序:比较器自动处理权值和高度规则,确保树结构正确。
  4. 适用场景:大规模数据处理,符合题目要求的 O(n log n) 时间复杂度和 O(n) 空间复杂度。

python

问题分析

我们需要根据给定的权值数组构建哈夫曼树,并输出其中序遍历结果。哈夫曼树的构建需满足:

  1. 权值规则:左节点权值 ≤ 右节点权值。
  2. 高度规则:权值相同时,左子树高度 ≤ 右子树高度。
  3. 高效构造:使用优先队列(小顶堆)合并最小节点,时间复杂度为 O(n log n)。

解题思路

  1. 优先队列初始化:将每个权值初始化为叶子节点,按权值从小到大排列,权值相同时按高度从小到大排列。
  2. 构建哈夫曼树
    • 每次从队列取出两个最小节点,合并为新节点。
    • 新节点的权值为子节点之和,高度为较大子树高度加一。
  3. 中序遍历:使用栈模拟递归遍历,按左 → 根 → 右顺序收集权值。

代码实现

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,

http://www.hkcw.cn/article/hheqCiTHob.shtml

相关文章

郑钦文:有梦就别怕痛 勇敢追梦闪耀法网

6月2日,郑钦文在社交平台上分享了她的感悟:人都应该有梦想,有了梦想就不要害怕困难,是宝石就应该发光。她还祝所有大朋友小朋友们节日快乐,勇敢追求自己的梦想。在法网女单第四轮比赛中,郑钦文以7-6(5)、1-6、6-3战胜了世界排名第18位的萨姆索诺娃,首次晋级法网女单八强…

马斯克xAI将启动3亿美元股份出售 估值达1130亿

亿万富翁埃隆马斯克旗下的人工智能公司xAI正在进行一项价值3亿美元的股份出售交易,将公司估值定为1130亿美元。此次交易允许员工向投资者出售股份,并计划进行一轮更大规模的融资,在此轮融资中xAI将向外部投资者发行新股。这次股份出售正值马斯克从美国政府离职,重新聚焦个人…

众多山区小商户被宝洁起诉 取证一年后索赔引发争议

商洛地区众多小商店突然收到法院传票,被广州宝洁有限公司起诉侵犯其注册商标专用权。原告在2023年上门取证,并在一年多后提起诉讼,提供了单方面的鉴定报告。商户们因时间过长,进货凭证多已丢失,应诉不利。他们表示当初从批发部进货并不知道是假货,且早已不再销售这些商品…

端午经济激发假日消费新活力 民俗活动丰富多彩

端午假期,各地开展了丰富多彩的特色活动,人们沉浸式体验端午民俗,乐享假日生活。景区游人如织、特色活动层出不穷。黄河壶口瀑布迎来夏季最佳观赏期,景区特别推出“非遗+文旅”主题活动,旱地龙舟赛、壶口斗鼓等特色项目轮番上演。山西太原晋祠博物馆迎来客流高峰,景区同步…

将写的博客系统部署到云服务器

Linux系统的使用&#xff1a; 当前写的博客系统程序&#xff0c;只是部署到自己电脑上&#xff0c;其他用户无法访问到。 由于NAT机制的存在&#xff0c;IP地址被分为了内网IP和外网IP 外网IP&#xff0c;云武器厂商提供的一些机器 不同的局域网之间可以重复。 云服务器是…

女子路上持械打砸多辆车被捕 肇事者已被警方逮捕

6月3日,一段女子在机动车道上持械打砸多辆车的视频引起了广泛关注。事件发生在6月2日的河南洛阳伊川县诚信东街与新城大道附近。据伊川县城关街道办工作人员透露,涉事者已被警方现场逮捕,有多辆车被砸。对于肇事者的动机,伊川县政府工作人员表示公安部门仍在调查中。伊川县…

黑救护车“宰客”3公里1800 家属无奈接受高价

家住广东省湛江市的张理没有想到,外公临终前回家的3公里路程竟然花费了1800元。2024年8月,因多种老年疾病住院两个月后,张理的外公到了弥留之际,医生表示已无救治意义,家属决定带老人回家保守治疗。然而,如何回家成了难题。普通汽车拒载病人,医院救护车也不提供服务。无…

【claude+deepseek+gemini】基于李群李代数和螺旋理论工业机器人控制系统软件UI设计

claude的首次设计html是最佳的。之后让deepseek和gemini根据claude的UI设计进行改进设计。。。当然可以尝试很多次&#xff0c;也可以让他们之间来回不断改进…… claude deepseek-r1 0528 上图为deepseek首次设计&#xff0c;下面为改进设计 …… Gemini 2.5 Pro 0506 &#x…

Baklib云内容中台的核心是什么?

云端智能架构驱动内容中枢 现代企业内容管理的核心挑战在于如何实现跨系统知识聚合与动态资源调度。通过云端智能架构的弹性扩展能力&#xff0c;系统可自动完成结构化与非结构化数据的标准化处理&#xff0c;其分布式计算引擎能够实时分析多源数据流&#xff0c;形成支持业务…

爱奇艺将免费直播国足客战印尼 生死战免付费观看

6月3日,爱奇艺体育宣布将为广大球迷免费直播本周四国足的世预赛生死战。比赛时间为北京时间6月5日21:45,2026美加墨世界杯预选赛亚洲区18强赛第9轮,国足将在客场挑战印尼队。前8轮比赛中,国足仅取得2胜6负的成绩,排在小组垫底,晋级前四的机会非常渺茫。如果客场对阵印尼不…

樊振东领衔上海队出战乒超联赛 双线作战挑战升级

新赛季,王楚钦领衔的山东魏桥向尚运动队能否卫冕备受关注。2025赛季中国乒乓球俱乐部超级联赛将于6月9日开赛,各俱乐部注册球员名单已公布。男团方面,上海地产集团队由樊振东和许昕领衔,樊振东将代表上海队参加乒超联赛。此前,樊振东宣布加入德甲劲旅萨尔布吕肯队,新赛季…

科技旅游火出圈 激发科技创新活力

近年来,我国科技事业取得历史性成就、发生历史性变革,载人航天、深空探测、“人造太阳”等科技成果捷报频传,进一步激发了全社会对科技创新的关注。进行一场新奇、有趣的科技旅游成为越来越多群众的选择。各地不断探索优化硬件、完善服务。海南文昌的瑶光火箭观礼平台是该省…

白岩松带球突入禁区 赵丽娜守门

白岩松PK赵丽娜,这场足球跨界对决太有料!责任编辑:zx0002

郑钦文萨巴伦卡隔空喊话 红土再对决

在2025年法国网球公开赛女单第四轮比赛中,郑钦文经过三盘激战击败了萨姆索诺娃,取得了罗兰加洛斯的10连胜,并刷新了个人法网最佳战绩。与此同时,在另一场1/8决赛中,头号种子萨巴伦卡在第八个赛点上成功战胜16号种子阿尼西莫娃,连续三年晋级法网八强。接下来的1/4决赛中,…

柳州一路面塌方车辆陷其中 官方回应 无人员伤亡正在处置

6月3日,广西柳州三江侗族自治县古宜镇一处突发塌方引发关注。现场视频显示,一排车辆停在临坡处的停车位,该坡下方的土层已经空缺,有车辆接连掉下,部分路面也损坏破裂。当天下午,三江侗族自治县应急管理局工作人员表示已有人在现场处置,没有人员伤亡。早上统计时只有一辆…

日本10年国债拍卖需求火爆 短暂提振市场信心

在全球长期收益率攀升的背景下,日本10年期国债拍卖意外获得强劲需求,为债券市场带来短暂喘息。周二的拍卖结果显示,本次2.6万亿日元的10年期国债拍卖中,投标倍数从上月的2.54大幅跃升至3.66,远超过去一年的平均水平。拍卖需求关键指标升至2024年4月以来最高水平。标售结果…

Arch安装devkitPro

DEVKITPRO/opt/devkitpro DEVKITARM/opt/devkitpro/devkitARM DEVKITPPC/opt/devkitpro/devkitPPC安装key sudo pacman-key --recv BC26F752D25B92CE272E0F44F7FD5492264BB9D0 --keyserver keyserver.ubuntu.com sudo pacman-key --lsign BC26F752D25B92CE272E0F44F7FD5492264…

大学生校内钓鱼被制止后自己滚水里 无赖行径引围观

6月2日,江苏南京一家学院内,一名男生在学校池塘偷偷钓鱼,被巡逻保安发现。保安要求他停止钓鱼,但男生却要求保安出示不能钓鱼的证据,并对保安出言不逊。保安劝阻无效后,建议男生叫来辅导员解决问题。男生不仅不听劝告,还准备动手推搡保安。保安见状与他对峙,期间男生被…

眼睛度数降了100度 近视600度是一个重要分界线

通常来说,100度~300度是轻度近视、300度~600度是中度近视、600度以上为高度近视。一般正常人眼轴是24毫米,越近视眼轴长度越长,就像一个气球不停往里吹气,导致眼球拉长、视网膜变薄。责任编辑:zx0002

巴黎世家平角短裤造型半身裙已缺货 设计引发热议

奢侈品牌巴黎世家近日推出的一款售价4500元的女款半身裙在网上引发热议。不少网友吐槽该裙子造型与平角短裤极为相似,直呼“看不懂时尚”。据巴黎世家官网介绍,这款深蓝色弹力平纹针织半身裙亮相于2025秋季系列Look 50和Look 54,采用弹力棉混纺平纹针织面料,为平角短裤造型…