Python二叉树前序递归遍历代码问题:缺失最后一个元素
问题排查与修复
核心问题分析
你的代码存在多个逻辑错误,导致遍历结果缺失元素:
- 可变默认参数陷阱:
recursionTravel函数使用returnArr = []作为默认参数,Python中可变默认参数会在函数定义时初始化一次,多次调用会复用同一个列表,导致数据混乱。 - 递归逻辑错误:递归调用时
returnArr.append(recursionTravel(...))完全多余——递归函数内部已经将节点数据加入数组,这里append的是递归函数的返回值(即node.data),既重复添加数据,又导致目标数组(output)无法正确收集所有节点。 - 参数传递错误:
pre_order中调用recursionTravel(node.left)时未传入output,导致递归操作的是默认列表而非output,最终output无法收集到深层节点(比如leaf)的数据。 - 空节点返回值缺失:当
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
相关产品推荐
相关产品推荐

