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

二叉树定和根叶路径查找:字符串版正常列表版结果异常排查

列表版本结果异常原因排查

核心原因是Python中字符串与列表的可变性差异,导致递归过程中参数传递的行为完全不同:

  • 字符串是不可变类型:版本1中执行a += str(root.data) + " "时,会生成全新的字符串对象,仅绑定到当前函数栈帧的局部变量a,不会修改上层调用栈中的变量值。递归进入左、右子树时,传递的是当前栈帧生成的独立字符串副本,左右子树的遍历操作不会互相污染路径数据,因此结果符合预期。
  • 列表是可变类型:版本2中整个递归链路传递的始终是同一个列表对象的内存引用,所有a.append()操作都是直接在原列表上做原地修改。左子树遍历过程中追加的节点值,在左子树遍历完成返回后不会自动清除,遍历右子树时这些残留值会继续留在列表中;叶子节点满足条件时追加的节点值也会持续累积,最终打印的列表会包含几乎所有遍历过的节点,结果完全错误。

修复方案

列表实现需要补充回溯逻辑,在当前节点的左右子树全部遍历完成后,把当前节点从路径列表中移除,保证返回上层调用时路径状态正确。修复后的代码如下:

def rootToLeafPathsSumToK(root, k, a):
    if root == None :
        return None
    
    if root.left==None and root.right==None:
        if root.data==k:
            # 拼接叶子节点值输出,不修改原路径列表
            print(a + [root.data])
        return

    a.append(root.data)
    rootToLeafPathsSumToK(root.left, k-root.data, a)
    rootToLeafPathsSumToK(root.right, k-root.data, a)
    # 回溯:清除当前层加入的节点,还原路径状态
    a.pop()

运行修复后的代码,输出结果和字符串版本完全一致:

[5, 6, 2]
[5, 7, 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:31:04