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

Python递归局部变量错误排查与代码修正(LeetCode叶子相似树)

问题分析与修正方案

你的推测完全正确——问题根源在于列表是可变对象,递归调用中传递的ans始终是同一个列表的引用,再加上你在代码里做了ans = ans + leaves(...)这种拼接操作,导致同一个叶子节点值被多次添加到列表中,最终出现重复元素。

错误原因拆解

以测试用例[1,2,3]为例:

  1. 调用leaves(root, [])时,根节点1的左右子节点都存在,执行ans = ans + leaves(root.left, ans) + leaves(root.right, ans)
  2. 进入leaves(root.left, ans)(节点2是叶子),此时ans是空列表,append 2后变成[2]并返回。回到上层时,原ans已经被修改为[2],拼接操作会把返回的[2]再追加一次,导致ans变成[2,2]
  3. 后续调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:23:19