剑指 Offer 34. 二叉树中和为某一值的路径
除了逻辑上的考虑之外,本题还需要注意深拷贝和浅拷贝的问题。
- 在把找到的结果追加到数组中时,需要通过 list() 函数将中间遍历得到的 path 进行深拷贝
这样,在退出 dfs 函数时,path 中的内容就不会被析构掉了。
下面是浅拷贝的结果
![dd890549a77770524d7fac1642091768.png](https://img-blog.csdnimg.cn/img_convert/dd890549a77770524d7fac1642091768.png)
在 dfs 退出时,path 数组 pop 清空,因此无内容了。
![33db47601c0dc1a9fe0e8dfd0bc66f22.png](https://img-blog.csdnimg.cn/img_convert/33db47601c0dc1a9fe0e8dfd0bc66f22.png)
答案
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: # 深度遍历本树,同时传入一个 sum 值,判断 sum 能减到 0 吗? # 终止条件是判断叶子节点和 sum 同时等于 0 res = [] def dfs(root, sum, res, path): if not root: return sum -= root.val path.append(root.val) if (sum == 0) and not root.left and not root.right: res.append(list(path)) dfs(root.left, sum, res, path) dfs(root.right, sum, res, path) path.pop() dfs(root, sum, res, []) return res