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

Inorder Binary Tree Traversal问题:递归实现中列表无法正确追加元素

问题原因

你代码的核心问题是每次递归调用inoder函数时,都会创建一个全新的空visited列表。递归处理左子树、右子树时,它们各自生成的遍历结果没有被合并到当前层的列表中,只有当前节点的值被添加到了自己的visited里。最终返回的是最上层调用(处理根节点1)的visited,里面自然只有根节点的值。

而控制台能正确打印所有值,是因为每个递归分支里的print(bomj.val)都会按中序遍历的顺序执行,和列表的独立存储无关。

修正方案

这里提供两种可行的修正方式:

方式1:将列表作为参数传递(共用同一个列表)

把visited设为可选参数,递归时传递同一个列表,避免重复创建:

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

def inoder(bomj, visited=None):
    # 初始化空列表,仅在第一次调用时执行
    if visited is None:
        visited = []
    if bomj:
        inoder(bomj.left, visited)
        visited.append(bomj.val)
        inoder(bomj.right, visited)
    return visited

tree = TreeNode(1)
tree.left = TreeNode(2)
tree.right = TreeNode(3)
tree.left.left = TreeNode(4)
tree.left.right = TreeNode(5)
tree.left.left.left = TreeNode(7)
tree.right.left = TreeNode(6)
print(inoder(tree))  # 输出: [7, 4, 2, 5, 1, 6, 3]

方式2:合并递归返回的结果

直接将左子树、右子树的递归遍历结果合并到当前列表中:

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

def inoder(bomj):
    visited = []
    if bomj:
        # 合并左子树的遍历结果
        visited += inoder(bomj.left)
        visited.append(bomj.val)
        # 合并右子树的遍历结果
        visited += inoder(bomj.right)
    return visited

tree = TreeNode(1)
tree.left = TreeNode(2)
tree.right = TreeNode(3)
tree.left.left = TreeNode(4)
tree.left.right = TreeNode(5)
tree.left.left.left = TreeNode(7)
tree.right.left = TreeNode(6)
print(inoder(tree))  # 输出: [7, 4, 2, 5, 1, 6, 3]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:12:48