# 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 []
#BFS
queue = collections.deque()
queue.append([root,[],0])
res = []
while queue:
node,path,total = queue.popleft()
if not node.left and not node.right and (total+node.val)==sum:
res.append(path+[node.val])
if node.left:
queue.append([root.left,path+[node.val],total+node.val])
if node.right:
queue.append([root.right,path+[node.val],total+node.val])
return res
#回溯算法
res = []
path = []
def huisu(root, sum):
if not root:
return None
path.append(root.val)
sum -= root.val
if not root.left and not root.right and sum == 0:
res.append(path[:])
huisu(root.left, sum)
huisu(root.right, sum)
path.pop()
huisu(root, sum)
return res
#递归DFS
def dfs(track, root, sum):
if not root:
return
if not root.left and not root.right and root.val == sum:
track += [root.val]
res.append(track)
dfs(track + [root.val], root.left, sum - root.val)
dfs(track + [root.val], root.right, sum - root.val)
dfs([], root, sum)
return res
这个是一个标准的回溯算法,回溯算法的跳出条件就是该节点是一个叶子节点,并且目前路径和是等于0的。因为题目的要求是找出所有路径和满足sum的所有路径,其实就是一个不断尝试,回退的一个过程,所以这个题目只要找到回溯的终止条件和回溯的遍历就可以了。
总结:标准的递归模板,当然也可以用BFS的模板进行处理,只不过每个节点需要存放节点信息, 路径和,路径信息。当然BFS的效率非常低。