5.17华为OD机试真题 新系统 – 输出二叉树后序遍历结果 (JavaPyCC++JsGo)

# 输出二叉树后序遍历结果

2026 华为OD机试真题 5月17日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定二叉树前序遍历和中序遍历的字符串,以及需要删除的节点,要求先解析这两个字符串获取对应二叉树,再做删除指定节点操作,然后输出该二叉树的后序遍历结果。删除节点规则:

1、指定节点是根节点,则不做删除操作;

2、指定节点是叶子节点,则直接删除;

3、指定节点是内部节点:

(1)如果是左子节点,则把该节点的左子树挂接到它的父节点,然后删除该节点以及它的右子树;

(2)如果是右子节点,则把该节点的右子树挂接到它的父节点,然后删除该节点以及它的左子树。

2026 华为OD机试真题 5月17日华为OD上机新系统考试真题 100 分题型

输入描述

string preorderStr // 前序遍历字符串

string inorderStr // 中序遍历字符串

char beDeletedNode // 待删除的节点

输出描述

string outputStr // 返回 "" 或者 后序遍历的字符串

string inorderStr // 中序遍历字符串

char beDeletedNode // 待删除的节点

注:

1、给定的preorderStr 和 inorderStr 是由大写字母组成的字符串,长度为2 \~ 26,每个字母表示一个节点值,且节点值唯一;

2、给定的 beDeletedLeafNode 是一个大写字母,如果输入的不是大写字母、或者找不到对应节点、或者找到的节点是根节点,都不做删除操作;

3、如果做了删除操作,则输出删除叶子节点后的二叉树后序遍历结果,否则直接输出二叉树后序遍历结果;

4、preorderStr 和 inorderStr 符合如下场景则输出空串"",例如:

(1)字符串中存在非大写字母;

(2)长度超出范围;

(3)节点值不唯一;

(4)两个字符串长度不一致;

(5)两个字符串元素不相同;

(6)无法解析出对应二叉树。

补充说明

1、程序运行内存要小于256MB;

2、程序运行耗时不能超过1秒。

示例1

输入

"23a","ABC",A

输出

""

说明

输入存在非法字符串

示例2

输入

"ADE","DAE",E

输出

"DA"

说明

示例3

输入

"AABCD","BAACD",A

输出

""

说明

出现重复节点值

示例4

输入

"ABC","BAC",A

输出

"BCA"

说明

找到的节点 A 是根节点

示例5

输入

"ABCDE","BAHDE",E

输出

""

说明

输入的两个遍历结果元素不相同

解题思路

核心思想

本题分为三个阶段:二叉树重建节点删除后序遍历

阶段一:二叉树重建(递归)

  • 前序遍历的第一个字符是根节点。
  • 在中序遍历中定位根节点,左侧为左子树,右侧为右子树。
  • 递归构造左右子树,返回根节点。
  • 时间复杂度 O(n),空间复杂度 O(n)。

阶段二:节点删除

  • 根节点不删除。
  • 叶子节点:直接断开父节点对应指针。
  • 内部节点:
    • 左子节点:将目标节点的左子树接到父节点的左侧,然后断开目标节点及其右子树。
    • 右子节点:将目标节点的右子树接到父节点的右侧,然后断开目标节点及其左子树。
  • 使用栈实现 DFS,找到目标节点的父节点。

阶段三:后序遍历

  • 按 左子树 → 右子树 → 根节点 的顺序递归遍历。
  • 输出为字符串。

复杂度分析

  • 时间复杂度: O(n),每个节点访问常数次。
  • 空间复杂度: O(n),递归栈 + 辅
THE END