LeetCode二叉树前序遍历递归解法单节点测试用例输出异常排查
问题原因与修复方案
核心问题根源
你遇到的是Python的可变默认参数特性导致的异常,和二叉树遍历逻辑本身无关。
Python的函数默认参数是在函数定义阶段完成初始化的,而非每次调用函数时重新生成。你将preorderTraversal的第二个参数默认值设为[],这个列表对象只会在类加载、函数第一次定义时创建一次,后续所有不传第二个参数的调用,都会复用同一个列表对象。
异常结果的来源
LeetCode执行测试用例时,会多次调用你编写的preorderTraversal方法处理不同输入。你遇到的[1,2,3,1]结果,就是前一个测试用例(通常是[1,null,2,3])执行后已经往共享列表里写入了[1,2,3],后续跑[1]用例时又往同一个列表追加了1,最终得到错误输出。
修复方案
方案1:调整默认参数初始化逻辑
将默认参数改为None,每次调用不传参数时重新初始化空列表,避免复用同一个对象:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: TreeNode, node_list = None) -> List[int]: if not root: return [] if node_list is None: node_list = [] node_list.append(root.val) for leaf in (root.left, root.right): if leaf is not None: self.preorderTraversal(leaf, node_list) return node_list
方案2:无参数递归写法
不通过传参共享列表,每次递归返回当前子树的遍历结果拼接,逻辑更简洁:
class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: if not root: return [] return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
内容的提问来源于stack exchange,提问作者Kaderma
相关产品推荐
相关产品推荐

