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

Python二叉树前序递归遍历代码问题:缺失最后一个元素

问题排查与修复

核心问题分析

你的代码存在多个逻辑错误,导致遍历结果缺失元素:

  1. 可变默认参数陷阱:recursionTravel函数使用returnArr = []作为默认参数,Python中可变默认参数会在函数定义时初始化一次,多次调用会复用同一个列表,导致数据混乱。
  2. 递归逻辑错误:递归调用时returnArr.append(recursionTravel(...))完全多余——递归函数内部已经将节点数据加入数组,这里append的是递归函数的返回值(即node.data),既重复添加数据,又导致目标数组(output)无法正确收集所有节点。
  3. 参数传递错误:pre_order中调用recursionTravel(node.left)时未传入output,导致递归操作的是默认列表而非output,最终output无法收集到深层节点(比如leaf)的数据。
  4. 空节点返回值缺失:当node为空时,recursionTravel没有返回值,会默认返回None,可能导致数组中混入无效值。

修复后的代码

直接简化为单函数递归实现,避免冗余逻辑:

def pre_order(node):
    output = []
    def traverse(current):
        if current:
            # 前序遍历:根 -> 左 -> 右
            output.append(current.data)
            traverse(current.left)
            traverse(current.right)
    traverse(node)
    return output

对原代码的针对性修复(保留原有函数结构)

如果一定要保留两个函数的结构,修正如下:

def recursionTravel(node, returnArr):
    if node:
        returnArr.append(node.data)
        recursionTravel(node.left, returnArr)
        recursionTravel(node.right, returnArr)

def pre_order(node):
    output = []
    recursionTravel(node, output)
    return output
  • 移除recursionTravel的可变默认参数,每次调用显式传入目标数组
  • 递归时不再append返回值,仅执行递归操作
  • pre_order直接调用recursionTravel并传入output,无需额外判断节点左右孩子

验证

假设你的二叉树结构为:

  • 根节点data=5,左孩子为data=10的节点
  • data=10的节点左孩子为data=2的节点
  • data=2的节点右孩子为data='leaf'的节点

使用修复后的代码调用pre_order(root),会正确返回[5, 10, 2, 'leaf']。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:57:13