二叉树定和根叶路径查找:字符串版正常列表版结果异常排查
列表版本结果异常原因排查
核心原因是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
相关产品推荐
相关产品推荐

