【2025刷题笔记】- 二叉树中序遍历

刷题笔记合集🔗

二叉树中序遍历

问题描述

小柯有一颗二叉树,她想通过中序遍历方式来遍历这棵树。中序遍历的顺序是:先访问左子树,再访问根节点,最后访问右子树。请您根据给定的二叉树结构描述字符串,输出该二叉树按照中序遍历结果字符串。

输入格式

输入为一个由大小写字母、左右大括号、逗号组成的字符串:字母代表一个节点值,左右括号内包含该节点的子节点。

左右子节点使用逗号分隔,逗号前为空则表示左子节点为空,没有逗号则表示右子节点为空。

二叉树节点数最大不超过

注:输入字符串格式是正确的,无需考虑格式错误的情况。

输出格式

输出一个字符串为二叉树中序遍历各节点值的拼接结果。

样例输入

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

样例输出

dbgehiafc

数据范围

  • 节点数
  • 每个节点的值为单个字母(大小写均可)
样例 解释说明
样例1 输入的字符串表示的二叉树结构如下:
根节点为 a,
a 的左子节点为 b,右子节点为 c,
b 的左子节点为 d,右子节点为 e,
c 的左子节点为 f,
e 的左子节点为 g,右子节点为 h,
h 的右子节点为 i。
按中序遍历得到:d→b→g→e→h→i→a→f→c

题解

这道题目要求我们根据一个特殊格式的字符串来构建二叉树,然后返回中序遍历的结果。

首先来看看这个字符串格式:字母表示节点值,左右括号内表示子节点,逗号分隔左右子节点。比如 a{b,c} 表示根节点 a,左子节点是 b,右子节点是 c。

这道题的难点在于如何解析这个字符串并构建二叉树。我们可以利用栈结构来解决这个问题,思路如下:

  1. 遍历输入字符串,使用一个栈保存字符。
  2. 当遇到非 } 字符时,直接压入栈中。
  3. 当遇到 { 字符时,记录它在栈中的索引位置。
  4. 当遇到 } 字符时,我们就找到了一个完整的子树结构:
    • 根据之前记录的 { 的索引,我们能找到子树的根节点。
    • 根据 {} 之间的内容,我们能分析出左右子节点。
    • 然后按照中序遍历规则(左-根-右)重组这个子树,替换掉栈中对应的部分。

通过这种方式,我们可以从内到外逐步解析整个二叉树结构,最终得到中序遍历的结果。

时间复杂度分析:我们只需要遍历输入字符串一次,对于每个字符的处理都是常数时间的操作,因此总体时间复杂度为 O(n),其中 n 是输入字符串的长度。这对于题目给出的数据范围(节点数不超过100)是完全足够的。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 从输入读取字符串
s = input()

# 算法入口
def solve_tree(s):
    # 保存左括号索引的栈
    idx_stack = []
    # 保存字符的栈
    char_stack = []

    # 遍历输入字符串
    for c in s:
        # 遇到右括号时,处理一个完整子树
        if c == '}':
            # 弹出对应左括号的索引
            l_idx = idx_stack.pop()
            # 获取根节点值(左括号前一个字符)
            root = char_stack[l_idx - 1]
            
            # 提取括号内的子节点部分
            sub_tree = ''.join(char_stack[l_idx + 1:])
            # 分割左右子节点
            parts = sub_tree.split(',', 1)
            
            # 处理左子节点
            left = parts[0] if parts else ""
            # 处理右子节点
            right = parts[1] if len(parts) > 1 else ""
            
            # 删除已处理的子树部分
            char_stack = char_stack[:l_idx - 1]
            # 按中序遍历顺序(左-根-右)重建子树
            char_stack.append(left + root + right)
            continue
        
        # 遇到左括号,记录其索引
        if c == '{':
            idx_stack.append(len(char_stack))
        
        # 其他字符直接加入栈
        char_stack.append(c)
    
    # 最终栈中只剩下中序遍历结果
    return char_stack[0]

# 输出结果
print(solve_tree(s))
  • Cpp
#include <bits/stdc++.h>
using namespace std;

// 解析二叉树并返回中序遍历结果
string inorder_traverse(const string& s) {
    // 保存左括号索引
    vector<int> br

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

10-15 10:23
门头沟学院 Java
牛可乐的头像真牛:赶紧举报,这公司绝对是诈骗的,等你签约后工作一两个月后根据合同漏洞把你开除,并且要求你赔偿3w培训费,996是为了提前筛选心甘情愿签下合同容易受骗的群体,纯粹面向校招生精心设计的骗局
你见过哪些工贼行为
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务