输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:[
[5,4,11,2],
[5,8,4,5]
]
思路
按深度优先遍历所有节点。
如果当前节点恰好满足给出的target,则将当前遍历的路径作为一个list append到result中;
如果当前节点为空,则返回继续遍历下一个节点;
否则,记录当前路径,并且根据当前节点的值更新目标值,开始遍历下一个节点。
Note:
1. 需要进行路径恢复。即向上回溯前,需要将当前节点从路径 res
中删除,即执行 res.pop().
2. 见下面的引用:
记录路径时若直接执行 result.append(
res
) ,则是将res
对象加入了 result ;后续 res 改变时, result 中的 res 对象也会随之改变。正确做法:result.append(list(
res)
) ,相当于复制了一个res
并加入到result
作者:jyd
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/mian-shi-ti-34-er-cha-shu-zhong-he-wei-mou-yi-zh-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
if (not root):
return []
self.result = []
self.res = []
self.subPathSum(root, sum)
return self.result
def subPathSum(self, root, target):
if not root:
return None
self.res.append(root.val)
if (root.val == target) and (not root.right) and (not root.left):
self.result.append(list(self.res))
print(self.result)
target = target-root.val
self.subPathSum(root.right, target)
self.subPathSum(root.left, target)
self.res.pop() # 回溯上一个节点前需要恢复路径
结果
复杂度分析
时间复杂度O(N)
空间复杂度O(N)