华为OD机试真题——二叉树的广度优先遍历(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 A卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《二叉树的广度优先遍历》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:二叉树的广度优先遍历


  1. 知识点:字符串处理、递归/分治算法(构建二叉树)、队列操作(BFS)
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出该二叉树的层次遍历结果。

输入描述
输入为两个字符串,第一个字符串表示后序遍历结果,第二个字符串表示中序遍历结果。字符串仅包含大写字母,且长度不超过26。

输出描述
输出二叉树的层次遍历结果,为一个连续字符串,无需分隔符。

示例
输入:

CBEFDA CBAEDF

输出:

ABDCEF

说明:
对应的二叉树结构为:

    A  / \  B   D  /   / \  
C   E   F

层次遍历顺序为A→B→D→C→E→F。


Java

问题分析

题目要求根据后序和中序遍历结果构建二叉树,并输出层次遍历结果。关键在于如何正确分割后序和中序序列以递归构建树。


解题思路

  1. 构建二叉树
    • 后序的最后一个元素为根节点。
    • 在中序中找到根的位置,分割左、右子树的中序序列。
    • 根据左子树节点数,分割后序的左、右子树部分。
  2. 层次遍历:使用队列实现广度优先遍历,按层输出节点。

代码实现

import java.util.*;class TreeNode {char val;TreeNode left;TreeNode right;TreeNode(char x) { val = x; }
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String postOrder = scanner.next();String inOrder = scanner.next();char[] in = inOrder.toCharArray();char[] post = postOrder.toCharArray();TreeNode root = buildTree(in, post);String result = levelOrder(root);System.out.println(result);}// 构建二叉树private static TreeNode buildTree(char[] in, char[] post) {return buildTreeHelper(in, 0, in.length - 1, post, 0, post.length - 1);}private static TreeNode buildTreeHelper(char[] in, int inStart, int inEnd, char[] post, int postStart, int postEnd) {if (inStart > inEnd || postStart > postEnd) return null;char rootVal = post[postEnd];TreeNode root = new TreeNode(rootVal);int rootPos = findRootPosition(in, inStart, inEnd, rootVal);int leftSize = rootPos - inStart;root.left = buildTreeHelper(in, inStart, rootPos - 1, post, postStart, postStart + leftSize - 1);root.right = buildTreeHelper(in, rootPos + 1, inEnd, post, postStart + leftSize, postEnd - 1);return root;}// 在中序数组中找到根的位置private static int findRootPosition(char[] in, int start, int end, char target) {for (int i = start; i <= end; i++) {if (in[i] == target) return i;}return -1;}// 层次遍历private static String levelOrder(TreeNode root) {if (root == null) return "";Queue<TreeNode> queue = new LinkedList<>();StringBuilder sb = new StringBuilder();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();sb.append(node.val);if (node.left != null) queue.offer(node.left);if (node.right != null) queue.offer(node.right);}return sb.toString();}
}

代码详解

  1. TreeNode类:定义二叉树的节点结构。
  2. main方法:读取输入的后序和中序字符串,转换为字符数组后构建树,输出层次遍历结果。
  3. buildTree方法
    • 调用buildTreeHelper递归构建树,参数为中序和后序数组的起始、结束索引。
    • 后序的最后一个元素为当前根节点。
    • 在中序数组中找到根的位置rootPos,计算左子树节点数leftSize
    • 递归构建左子树和右子树,分割后序数组的左右部分。
  4. findRootPosition方法:遍历中序数组,返回根的位置。
  5. levelOrder方法:使用队列实现层次遍历,按层输出节点。

示例测试

  1. 输入1

    CBEFDA CBAEDF  
    

    输出

    ABDCEF  
    

    说明:构建的树结构为A→B→D→C→E→F。

  2. 输入2

    CEDBA CBEDA  
    

    输出

    ABDCE  
    

    说明:构建的树结构为A→B→D→C→E。

  3. 输入3

    CBA CBA  
    

    输出

    ABC  
    

    说明:构建的树结构为A→B→C,层次遍历顺序为A→B→C。


综合分析

  1. 时间复杂度

    • 构建树:O(n^2),每次递归需遍历中序数组查找根位置。
    • 层次遍历:O(n),每个节点进出队列一次。
  2. 空间复杂度

    • O(n),存储递归调用栈和队列。
  3. 正确性

    • 通过索引精确分割数组,确保树的结构正确。
    • 层次遍历队列保证节点按层输出。
  4. 优势

    • 索引分割:避免字符串切割错误,提高精度。
    • 队列遍历:简单高效实现层次遍历。
  5. 适用性

    • 支持最多26个节点的输入,满足题目要求。

python

问题分析

题目要求根据后序和中序遍历结果构建二叉树,并输出层次遍历结果。关键在于如何正确分割后序和中序序列以递归构建树,并通过广度优先遍历(BFS)输出层次遍历结果。


解题思路

  1. 构建二叉树
    • 后序的最后一个元素为当前子树的根节点。
    • 在中序中找到根的位置,分割左、右子树的中序序列。
    • 根据左子树节点数,分割后序的左、右子树部分。
    • 递归构建左子树和右子树。
  2. 层次遍历:使用队列实现广度优先遍历(BFS),按层输出节点。

代码实现

class TreeNode:def __init__(self, val):self.val = valself.left = Noneself.right = Nonefrom collections import dequedef build_tree(in_order, post_order):# 创建哈希表快速查找根节点在中序的位置hash_map = {val: idx for idx, val in enumerate(in_order)}def helper(in_left, in_right, post_left, post_right):if post_left > post_right:return None# 后序的最后一个元素是当前根节点root_val = post_order[post_right]root = TreeNode(root_val)# 查找根节点在中序中的位置root_idx = hash_map[root_val]# 左子树的节点个数left_size = root_idx - in_left# 递归构建左子树root.left = helper(in_left, root_idx - 1, post_left, post_left + left_size - 1)# 递归构建右子树root.right = helper(root_idx + 1, in_right, post_left + left_size, post_right - 

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

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

相关文章

[java八股文][JavaSpring面试篇]Mybatis

与传统的JDBC相比&#xff0c;MyBatis的优点&#xff1f; 基于 SQL 语句编程&#xff0c;相当灵活&#xff0c;不会对应用程序或者数据库的现有设计造成任 何影响&#xff0c;SQL 写在 XML 里&#xff0c;解除 sql 与程序代码的耦合&#xff0c;便于统一管理&#xff1b;提供 …

数据库 | 时序数据库选型

选型目标 高性能与低延迟&#xff1a;满足高频率数据写入与即时查询的需求。资源效率&#xff1a;优化存储空间使用&#xff0c;减少计算资源消耗。可扩展架构&#xff1a;支持数据量增长带来的扩展需求&#xff0c;易于维护。社区活跃度&#xff1a;有活跃的开发者社区&#…

MobaXterm连接Docker Desktop中的容器(shell)

对于使用docker desktop的同学&#xff0c;想要直连docker容器不需要借助ssh协议&#xff0c;可以直接通过shell访问控制台&#xff0c;配置如下&#xff1a; 选择terminal shell类型&#xff0c;我选择的是powershell 。 输入terminal启动命令&#xff1a;docker exec -it [你…

两个Ubuntu机器(内网)免密登录设置

业务背景&#xff1a;现有两个机器&#xff1b;A&#xff08;192.168.1.10&#xff09;、B&#xff08;192.168.1.20&#xff09;&#xff1b; 需要机器A可以免密登录B&#xff0c;具体操作如下&#xff1a; 1、首先在机器A中&#xff0c;上生成 SSH 密钥对&#xff08;公钥和私…

支持selenium的chrome driver更新到136.0.7103.113

最近chrome释放新版本&#xff1a;136.0.7103.113 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

SQL中各个子句的执行顺序

select、from、 join、where、order by、group by、having、limit 解释 1) FROM (确定数据源) 查询的执行首先从FROM子句开始&#xff0c;确定数据的来源(表、视图、连接等)。 2) JOIN (如果有JOIN操作) 在FROM子句之后&#xff0c;SQL引擎会执行连接操作(JOIN)&#xff0c…

若依微服务的定制化服务

复制依赖 复制依赖 复制system服务的bootstrap.yml文件&#xff0c;修改port和name 在nacos复制一个新的nacos配置&#xff0c;修改对应的nacos的配置 &#xff0c;可能不需要修改&#xff0c;看情况。 网关修改 注意curd的事项&#xff0c;模块名称的修改

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀&#xff1a;淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「下雨效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完…

纯数据挖掘也能发Microbiome?

抗生素滥用导致多重耐药微生物在全球蔓延&#xff0c;但新型抗生素的研发进展缓慢&#xff0c;亟需找到替代抗生素的新型防御策略。抗菌肽&#xff08;AMPs&#xff09;作为天然防御分子&#xff0c;具有低耐药潜力和广谱活性。德国小蠊&#xff08;Blattella germanica&#x…

动态内容加载时,爬虫应如何处理?

处理动态内容加载是爬虫开发中的一个常见挑战。许多现代网站使用 JavaScript 动态加载内容&#xff0c;这意味着页面的某些部分可能在初始加载时并不存在&#xff0c;而是通过后续的 AJAX 请求或 JavaScript 执行动态生成的。为了处理这种情况&#xff0c;爬虫需要能够模拟浏览…

uni-app 安卓消失的字符去哪里了?maxLength失效了!

前情提要 皮一下~这个标题我还蛮喜欢的嘿嘿嘿【附上一个自行思考的猥琐的笑容】 前段时间不是在开发uni-app的一个小应用嘛,然后今天测试发现,有一个地方在苹果是没有问题的,但是在安卓上出现了问题,附上安卓的截图 在这里我是有限制maxLength=50的,而且,赋值字符串到字…

2025年5月蓝桥杯stema省赛真题——象棋移动

上方题目可点下方去处&#xff0c;支持在线编程&#xff5e; 象棋移动_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方&#xff0c;支持源码和素材获取&#xff5e; 象棋移动-scratch作品-少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级…

Cesium 实战 26 - 自定义纹理材质 - 实际应用之飞线(抛物线)

Cesium 实战 26 - 自定义纹理材质 - 实际应用之飞线(抛物线) 前言核心代码完整代码在线示例前言 之前总结了项目实战用常用的自定义纹理材质,包括扩散、预警、动态线等,后续还会不定期增加一些效果。 除了单个的自定义纹理材质介绍,文章系列后期会增加一些实际项目应用、…

Apache Airflow

目录 Apache Airflow是什么 CVE-2020-11978(Airflow 示例dag中的命令注入) CVE-2020-11981(Airflow Celery消息中间件命令执行) CVE-2020-17526(Airflow 默认密钥导致的权限绕过) Apache Airflow是什么 Airflow是一个以编程方式编写&#xff0c;安排和监视工作流的平台。 …

【Python Cookbook】迭代器与生成器(四)

目录 案例 目录 案例 迭代器与生成器&#xff08;一&#xff09;1.手动遍历迭代器2.代理迭代3.使用生成器创建新的迭代模式4.实现迭代器协议迭代器与生成器&#xff08;三&#xff09;9.排列组合的迭代10.序列上索引值迭代11.同时迭代多个序列12.不同集合上元素的迭代迭代器与生…

React 播客专栏 Vol.16|useRef 和 useMemo 是干嘛的?

&#x1f44b; 欢迎回到《前端达人 React 播客书单》第 16 期&#xff08;正文内容为学习笔记摘要&#xff0c;音频内容是详细的解读&#xff0c;方便你理解&#xff09;&#xff0c;请点击下方收听 视频版 &#x1f399; 欢迎来到《前端达人 播客书单》第 16 期。 今天我们来…

漫谈英伟达GPU架构进化史:从Celsius到Blackwell

在英伟达官网,我们可以清晰地看到其从1999年Celsius到2024年Blackwell的20+代架构演进。这一历程犹如一部波澜壮阔的科技史诗,见证了英伟达在GPU领域的卓越创新与持续引领。 NVIDIA GPU架构变迁路线: 年份 NV GPU架构变迁 2025 Blackwell 2.0 2024 Blackwell 2023-2024 Hopp…

车载通信网络 --- CAN FD与CAN XL

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

DM达梦数据库开启SQL日志记录功能

DM达梦数据库开启SQL日志记录功能 配置SQL日志&#xff08;非必须的配置步骤&#xff0c;与主备集群配置无关&#xff0c;如果没有需求可以跳过配置SQL日志&#xff09; sqllog.ini 配置文件用于SQL日志的配置&#xff0c;当且仅当 INI&#xff08;dm.ini&#xff09; 参数 SV…

【HW系列】—C2远控服务器(webshell链接工具, metasploit、cobaltstrike)的漏洞特征流量特征

文章目录 蚁剑、冰蝎、哥斯拉一、蚁剑&#xff08;AntSword&#xff09;流量特征二、冰蝎&#xff08;Behinder&#xff09;流量特征三、哥斯拉&#xff08;Godzilla&#xff09;流量特征 metasploit、cobaltstrike一、Metasploit流量特征二、CobaltStrike流量特征三、检测与防…