You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于字符串表达式构建二叉树 中序遍历实现方案问询

基于中序特征字符串构建二叉树的实现思路与技巧

首先先明确该类字符串的通用编码规则:( 代表子树起始,) 代表子树结束,! 是节点值的起止分隔符,两个!中间的内容为节点值,无!标记的括号范围对应空节点,整体字符串顺序严格对应二叉树中序遍历的「左子树-根节点-右子树」顺序。

核心实现思路

  • 选择栈作为核心数据结构处理括号的嵌套层级关系,天然适配嵌套子树的解析场景
  • 逐字符遍历字符串,同步维护当前处理节点与栈内层级关系:

    遇到(时往栈内压入空占位符,标记新一层子树开始
    遇到!时读取两个!之间的内容生成真实二叉树节点,替换栈顶的空占位符
    遇到)时弹出栈顶的当前子树根节点,将其挂载到上层父节点的空缺子节点位置:上层父节点左子节点为空则挂载到左,左子节点已存在则挂载到右

  • 遍历完成后,栈底剩余的唯一节点即为整棵二叉树的根节点

可参考的实现技巧

  • 提前做输入预处理:如果输入存在冗余空格可以提前统一移除,减少遍历过程中的无效判断分支,无空格输入可跳过该步骤
  • 用指针偏移提升遍历效率:遇到!后直接查找下一个配对!的索引,一次性读取完整节点值,不需要逐字符拼接,比如Python中可以用str.find('!', current_pos)快速定位分隔符位置
  • 栈内存储二元组简化逻辑:可以将栈元素定义为(父节点, 子节点挂载标记),提前约定下一个弹出节点的挂载位置,不用额外判断父节点左右子节点的占用状态
  • 增加边界校验逻辑:提前校验括号配对数量、!配对数量,避免非法输入导致的数组越界、逻辑混乱问题

参考代码片段(Python)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def build_tree(s: str) -> TreeNode:
    stack = []
    n = len(s)
    i = 0
    while i < n:
        if s[i] == '(':
            stack.append(None)
            i += 1
        elif s[i] == ')':
            cur_node = stack.pop()
            if stack:
                parent_node = stack[-1]
                if parent_node.left is None:
                    parent_node.left = cur_node
                else:
                    parent_node.right = cur_node
            i += 1
        elif s[i] == '!':
            i += 1
            val_start_idx = i
            # 直接找下一个!的位置,读取节点值
            while i < n and s[i] != '!':
                i += 1
            node_val = s[val_start_idx:i]
            stack.append(TreeNode(node_val))
            i += 1
        else:
            # 跳过无意义的特殊字符
            i += 1
    return stack[0] if stack else None

内容的提问来源于stack exchange,提问作者user17084977

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:06:04