# 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]]:
#方法一 递归 DFS
# if not root:
# return [] #定义边界条件
# res = []
# def root_sum(node , path , sum_val):
# if sum_val == sum and not node.left and not node.right:
# res.append(path)#定义递归出口,如果到了根节点,且和为sum,则将path添加到res
# if node.left: #如果左子节点有值,则去递归左子节点
# root_sum(node.left , path+[node.left.val], sum_val + node.left.val) #注意这里是+【】
# if node.right:
# root_sum(node.right, path+[node.right.val], sum_val + node.right.val)
# root_sum(root, [root.val], root.val) #☆注意此时的sum_val初始化为根节点的值,而不是sum
# #[path]是值的路径,不是节点的路径,所以初始化时应该是[root.val],不是[root]
# return res
#方法二 迭代 BFS就是迭代 使用队列实现BFS
if not root:
return []
q = [(root , [root.val], root.val)] #初始化多元素队列时,一定要记着多元素是有括号的[a,b,c]×[(a,b,c)]√
res = []
for t in q:
node,path,sum_val=t
if sum_val == sum and not node.left and not node.right:
res.append(path)
if node.left:
q.append((node.left , path + [node.left.val],sum_val+node.left.val))#队列添加多元素时也要记得括号
if node.right:
q.append((node.right, path + [node.right.val],sum_val+node.right.val))
return res
时间复杂度O(n)每个节点只需要遍历1次
空间复杂度O(n2)
递归的栈的消耗n,每个递归调用里面又要分配n个节点的路径
队列需要存n个三元组,每个元组中的路径又包含n个节点