Python递归局部变量错误排查与代码修正(LeetCode叶子相似树)
问题分析与修正方案
你的推测完全正确——问题根源在于列表是可变对象,递归调用中传递的ans始终是同一个列表的引用,再加上你在代码里做了ans = ans + leaves(...)这种拼接操作,导致同一个叶子节点值被多次添加到列表中,最终出现重复元素。
错误原因拆解
以测试用例[1,2,3]为例:
- 调用
leaves(root, [])时,根节点1的左右子节点都存在,执行ans = ans + leaves(root.left, ans) + leaves(root.right, ans) - 进入
leaves(root.left, ans)(节点2是叶子),此时ans是空列表,append 2后变成[2]并返回。回到上层时,原ans已经被修改为[2],拼接操作会把返回的[2]再追加一次,导致ans变成[2,2] - 后续调用
leaves(root.right, ans)时,节点3是叶子,append 3后ans变成[2,2,3],返回后再次拼接,最终得到[2,2,2,3]
修正方案
有两种简洁的修正思路:
方案1:递归返回新列表,不传递可变参数
这种方式更符合函数式风格,每次递归返回当前节点子树的叶子列表,上层直接拼接结果:
def leaves(root): if not root: return [] if not root.left and not root.right: return [root.val] return leaves(root.left) + leaves(root.right)
使用时直接调用leaves(root1)和leaves(root2),然后比较两个列表是否相等即可。
方案2:传递可变列表但仅做append操作,不拼接赋值
保持传递ans的方式,但只在叶子节点时执行append,递归调用时不做赋值操作——因为列表是可变对象,修改会直接反映到上层:
def leaves(root, ans): if not root: return if not root.left and not root.right: ans.append(root.val) return leaves(root.left, ans) leaves(root.right, ans)
使用时初始化空列表,调用后获取结果:
ans = [] leaves(root, ans) print(ans) # 输出[2,3]
这两种方案都能解决重复添加的问题,方案1更简洁,方案2适合需要在递归中逐步收集结果的场景。
内容的提问来源于stack exchange,提问作者Siddharth Somani
相关产品推荐
相关产品推荐

