华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

article/2025/8/2 19:40:41

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《二叉树中序遍历》:


目录

    • 题目名称:二叉树中序遍历
      • 题目描述
      • 示例
    • Java
      • 题目分析
      • 解决思路
      • Java 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • python
      • 题目分析
      • 解决思路
      • Python 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • JavaScript
      • 题目分析
      • 解决思路
      • JavaScript 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • C++
      • 题目分析
      • 解决思路
      • C++ 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • C语言
      • 解决思路
      • C 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • GO
      • 问题分析
      • 解决思路
      • Go 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析


题目名称:二叉树中序遍历


  • 知识点:字符串解析、栈操作(递归)
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

输入一个由字母、大括号和逗号组成的字符串表示二叉树结构:

  • 单个字母表示节点值,大括号内为子节点,逗号分隔左、右子节点。逗号前为空则左子节点为空,无逗号则右子节点为空。
  • 例如,输入 a{b{c},d{e,f}} 表示根节点为 a,左子节点为 b{c}b 有左子节点 c),右子节点为 d{e,f}d 有左子节点 e,右子节点 f)。

输入描述
一行字符串,表示二叉树结构,如 a{b{d,e{g,h{,i}}},c{f}}

输出描述
输出中序遍历结果的拼接字符串,如 dbgehiafc

示例

输入:

a{b{d,e{g,h{,i}}},c{f}}  

输出:

dbgehiafc  

补充说明

  • 节点数不超过 100。
  • 输入字符串格式正确,无需校验。

Java

题目分析

我们需要将特定格式的字符串转换为二叉树结构,并进行中序遍历。字符串格式为:每个节点由字母表示,子节点用大括号包裹,逗号分隔左右子节点。例如,a{b{c},d{e,f}} 表示根节点 a 有左子节点 b(其左子节点为 c)和右子节点 d(其左右子节点为 ef)。


解决思路

  1. 字符串解析:使用递归和栈的思想处理嵌套结构,分割左右子节点。
  2. 树构建:递归解析每个节点及其子节点,构建二叉树。
  3. 中序遍历:递归遍历二叉树,拼接结果。

Java 代码实现

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 input = scanner.nextLine().trim();TreeNode root = parse(input);String result = inorder(root);System.out.println(result);}// 解析字符串为二叉树private static TreeNode parse(String s) {if (s.isEmpty()) return null;int i = 0;// 提取当前节点值(第一个字母)char val = s.charAt(i++);TreeNode node = new TreeNode(val);// 检查是否有子节点(是否有 '{')if (i < s.length() && s.charAt(i) == '{') {int start = i;int count = 1; // 括号层数计数器i++; // 跳过 '{'// 找到匹配的 '}'while (i < s.length() && count > 0) {if (s.charAt(i) == '{') count++;else if (s.charAt(i) == '}') count--;i++;}// 子节点部分(去掉外层括号)String children = s.substring(start + 1, i - 1);// 分割左右子节点List<String> parts = splitChildren(children);node.left = parse(parts.get(0));node.right = parse(parts.get(1));}return node;}// 分割左右子节点字符串private static List<String> splitChildren(String s) {List<String> parts = new ArrayList<>();int count = 0; // 括号层数int splitIndex = -1;// 遍历找到第一个外层逗号for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '{') count++;else if (c == '}') count--;else if (c == ',' && count == 0) {splitIndex = i;break;}}if (splitIndex != -1) { // 存在分割点parts.add(s.substring(0, splitIndex));parts.add(s.substring(splitIndex + 1));} else { // 无分割点,整个字符串是左子节点parts.add(s);parts.add("");}return parts;}// 中序遍历二叉树private static String inorder(TreeNode root) {if (root == null) return "";return inorder(root.left) + root.val + inorder(root.right);}
}

代码详细解析

  1. TreeNode 类:定义二叉树的节点结构,包含值和左右子节点。
  2. parse 方法
    • 提取节点值,处理子节点部分。
    • 使用括号层数计数器匹配 {},截取子节点字符串。
    • 递归解析左右子节点。
  3. splitChildren 方法
    • 遍历子节点字符串,找到第一个外层逗号分割左右子节点。
    • 处理嵌套括号,确保分割正确。
  4. inorder 方法:递归中序遍历,拼接结果字符串。

示例测试

示例1
输入:a{b{d,e{g,h{,i}}},c{f}}
输出:dbgehiafc
解析过程:

  • 根节点 a,左子节点 b 和右子节点 c
  • b 的左子节点 d,右子节点 ee 的左子节点 g,右子节点 h
  • h 的右子节点 ic 的左子节点 f
  • 中序遍历顺序:d -> b -> g -> e -> h -> i -> a -> f -> c

示例2
输入:x{y{z},w}
输出:zyxw
解析过程:

  • 根节点 x,左子节点 y 和右子节点 w
  • y 的左子节点 z
  • 中序遍历顺序:z -> y -> x -> w

综合分析

  1. 高效性:递归解析字符串,时间复杂度 O(n)。
  2. 健壮性:处理嵌套括号和逗号分割,确保正确分割子节点。
  3. 简洁性:利用递归和字符串操作,代码逻辑清晰。
  4. 适用性:完全符合题目要求,处理各种边界条件。

python

题目分析

我们需要将特定格式的字符串转换为二叉树结构,并进行中序遍历。字符串格式规则为:单个字母表示节点值,大括号内为子节点,逗号分隔左、右子节点。例如,a{b{c},d{e,f}} 表示根节点 a 的左子节点为 b(其左子节点为 c),右子节点为 d(其左右子节点为 ef)。


解决思路

  1. 字符串解析:递归解析字符串,处理嵌套的大括号结构,分割左右子节点。
  2. 树构建:根据解析结果递归构建二叉树。
  3. 中序遍历:递归遍历二叉树,拼接结果字符串。

Python 代码实现

class TreeNode:def __init__(self, val):self.val = valself.left = Noneself.right = Nonedef parse(s):"""解析字符串为二叉树:param s: 当前处理的子字符串(如 "a{b{c},d{e,f}}"):return: 当前子树的根节点"""if not s:return None# 提取当前节点值(第一个字符)val = s[0]node = TreeNode(val)idx = 1  # 当前处理位置的索引# 检查是否有子节点(是否有 '{')if idx < len(s) and s[idx] == '{':idx += 1  # 跳过 '{'start = idxcount = 1  # 括号层数计数器# 找到匹配的 '}'while idx < len(s) and count > 0:if s[idx] == '{':count += 1elif s[idx] == '}':count -= 1idx += 1# 提取子节点部分(去掉外层 '{}')children_str = s[start: idx-1]# 分割左右子节点字符串left_str, right_str = split_children(children_str)# 递归处理左子树和右子树node.left = parse(left_str)node.right = parse(right_str)return nodedef split_children(s):"""分割左右子节点字符串(处理嵌套括号):param s: 子节点部分的字符串(如 "b{c},d{e,f}"):return: (左子节点字符串, 右子节点字符串)"""count = 0  # 括号层数split_idx = -1# 遍历寻找最外层的逗号for i, c in enumerate(s):if c == '{':count += 1elif c == '}':count -= 1elif c == ',' and count == 0:split_idx = ibreak  # 找到第一个可分割的逗号if split_idx != -1:# 分割左、右子节点部分return s[:split_idx], s[split_idx+1:]else:# 无逗号表示只有左子树,右子树为空return s, ''def inorder(root):"""中序遍历二叉树,拼接结果字符串:param root: 当前节点:return: 遍历结果字符串"""if not root:return ''return inorder(root.left) + root.val + inorder(root.right)# 输入处理
input_str = input().strip()
root = parse(input_str)
print(inorder(root))

代码详细解析

  1. TreeNode
class TreeNode:def __init__(self, val):self.val = valself.left = Noneself.right = None
  • 定义二叉树节点结构,包含值和左右子节点。
  1. parse 函数
def parse(s):if not s:return Noneval 

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

相关文章

现代密码学 | 高级加密标准(AES)

接下来我们将讨论目前大多数计算机和硬件基础设施所使用的最重要的加密算法&#xff0c;例如高级加密标准&#xff08;AES&#xff09;、里弗斯特-沙米尔-阿德曼算法&#xff08;RSA&#xff09;、椭圆曲线加密&#xff08;ECC&#xff09;、基于格的加密、&#xff08;环&…

cocos creator资源管理器,资源动态加载和释放

cocos 2.4.11版本 cocos 动态加载的资源需要自己增加引用和减少引用计数 cc.Asset.addRef 和 cc.Asset.decRef 注意&#xff1a; 1.使用当前代码管理资源&#xff0c;要区分项目中的静态资源和动态资源&#xff0c;静态资源就是预制体或者场景中的资源&#xff0c;代码中动态…

认识scratch,scratch是什么,如何使用

scratch是图形编程&#xff0c;将编程简化为积木的堆叠和嵌套&#xff0c;无需手写代码&#xff0c;只需清晰的逻辑即可完成自己的代码设计。通过它可以制作简单的小游戏等。 如图所示&#xff0c;这个就是scratch打开的界面&#xff0c;整个界面分为左中右三个部分&#xff0c…

HarmonyOS实战:腾讯IM之聊天详情页面搭建(二)

前言 鸿蒙版本腾讯 IM 的聊天功能十分复杂&#xff0c;需要开发者手动实现整个聊天对话的业务代码&#xff0c;这对开发者来说是个不小的挑战。本篇文章先从最基础的聊天对话列表开始教你一步一步实现完整的聊天功能&#xff0c;建议点赞收藏&#xff01; 实现效果 先看本文…

IM系统的负载均衡

1.IM场景的负载均衡 2.方案总览 SDK层想要连接一个TCP网关或者WebSocket网关的方案 SDK单地址:在SDK中写死某个网关的IP或者域名,缺点是更换地址需要重新打包SDK SDK多地址:防止某一个地址嗝屁了写上多个地址用足保持高可用 暴露接口给客户端:SDK层访问接口动态获得地址 注…

动态规划之网格图模型(一)

文章目录 动态规划之网格图模型&#xff08;一&#xff09;LeetCode 64. 最小路径和思路Golang 代码 LeetCode 62. 不同路径思路Golang 代码 LeetCode 63. 不同路径 II思路Golang 代码 LeetCode 120. 三角形最小路径和思路Golang 代码 LeetCode 3393. 统计异或值为给定值的路径…

血糖监测仪解决方案推荐芯片-NRF52832/HS6621/OM6626

随着糖尿病患者数量的增加和人们健康意识的提升&#xff0c;血糖监测仪成为了日常健康管理的重要设备。市场对便携、智能且易于使用的血糖监测仪需求持续增长&#xff0c;而无线通信技术&#xff0c;尤其是蓝牙技术&#xff0c;已成为现代血糖监测仪的核心组件&#xff0c;提供…

基于Vite的前端自动化部署方案

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;全栈领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、主流解决方案二、了解SCP概念三、自动化部署…

PlankAssembly 笔记 DeepWiki 正交视图三维重建

manycore-research/PlankAssembly | DeepWiki PlankAssembly项目原理 这个项目是一个基于深度学习的3D重建系统&#xff0c;其核心原理是从三个正交视图的工程图纸中重建出3D形状的结构化程序表示。 核心技术原理 1. 问题定义 PlankAssembly旨在从三个正交视图的工程图纸中…

MQTT协议,EMQX部署,MQTTX安装学习

一、MQTT概述 1.什么是MQTT MQTT是一种基于“发布订阅“”模式的消息传输协议。 消息&#xff1a;设备和设备之间传输的数据&#xff0c;或者服务和服务之间要传输的数据。 协议&#xff1a;传输数据时所遵循的规范。 2.常见的通讯模式 &#xff08;1&#xff09;客户端-服…

多模态大语言模型arxiv论文略读(101)

ML-Mamba: Efficient Multi-Modal Large Language Model Utilizing Mamba-2 ➡️ 论文标题&#xff1a;ML-Mamba: Efficient Multi-Modal Large Language Model Utilizing Mamba-2 ➡️ 论文作者&#xff1a;Wenjun Huang, Jiakai Pan, Jiahao Tang, Yanyu Ding, Yifei Xing, …

论文阅读:ADVWEB : CONTROLLABLE BLACK-BOX ATTACKS ON VLM-POWERED WEB AGENTS

原文&#xff1a;2410.17401 源码&#xff1a;https://ai-secure.github.io/AdvWeb/ 摘要&#xff1a; 本文设计了一种专门针对web agent的黑盒攻击框架&#xff0c;通过训练一个对抗性提示生成模型&#xff0c;在网页中自动生成并注入“隐形”对抗性字符串&#xff0c;引导网…

Wireshark 在 macOS 上使用及问题解决

wireshark概述 Wireshark 是被广泛使用的免费开源网络协议分析软件&#xff08;network protocol analyzer&#xff09;或网络数据包分析工具&#xff0c;它可以让你在微观层面上查看网络上发生的事情。它的主要功能是截取网络数据包&#xff0c;并尽可能详细地展示网络数据包…

企业级安全实践:SSL/TLS 加密与权限管理(一)

引言 ** 在数字化转型的浪潮中&#xff0c;企业对网络的依赖程度与日俱增&#xff0c;从日常办公到核心业务的开展&#xff0c;都离不开网络的支持。与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;成为企业发展过程中不可忽视的重要挑战。 一旦企业遭遇网络安全事…

#Js篇:BlobFile对象URL.createObjectURL()fetchlocationnavigatornew URl

Blob 在 JavaScript 中&#xff0c;Blob 是一个非常重要的对象&#xff0c;用于表示不可变的、原始的二进制数据块&#xff08;Binary Large Object&#xff09; arrayBuffer()&#xff1a;获取 Blob 的二进制数据作为 ArrayBuffer。 stream()&#xff1a;创建一个可读流&…

HAProxy 可观测性最佳实践

HAProxy 简介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款广泛使用的高性能负载均衡器&#xff0c;支持 TCP 和 HTTP 协议&#xff0c;提供高可用性、负载均衡和代理服务。它特别适用于负载较大的 Web 站点&#xff0c;能够支持数以万计的并发连接&#xf…

软件测试|FIT故障注入测试工具——ISO 26262合规下的智能汽车安全验证引擎

FIT&#xff08;Fault Injection Tester&#xff09;是SURESOFT专为汽车电子与工业控制设计的自动化故障注入测试工具​&#xff0c;基于ISO 26262等国际安全标准开发&#xff0c;旨在解决传统测试中效率低、成本高、安全隐患难以复现的问题&#xff0c;其核心功能包括&#xf…

【计算机网络】应用层协议Http——构建Http服务服务器

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【Linux笔记】——进程间关系与守护进程 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、Http协…

[ctfshow web入门] web80

信息收集 过滤了php和data if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);include($file); }else{highlight_file(__FILE__); }解题 大小写…

移动安全Android——客户端数据安全

本地文件权限配置 测试流程 &#xff08;1&#xff09;手机运行待测APP应用&#xff0c;adb执行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY &#xff08;2&#xff09;adb shell 进入设备&#xff0c;以Root权限进入/data/data/package包名目录下 c…