class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def pathSum(self, root: TreeNode, target: int) -> list[list[int]]:
result = []
temp = []
def dfs(node):
if not node:
return
temp.append(node.val)
if sum(temp) == target and not node.right and not node.left:
# 这里不可以直接将temp append到result中,后面temp的改变会使result也改变
result.append([_ for _ in temp])
dfs(node.left)
dfs(node.right)
# 回溯时消除上一个节点的元素
temp.pop(-1)
dfs(root)
return result
# 优化:将target设成动态的new_target -= node.val,来避免每次遍历都需要对temp求和,这样到遍历到叶子节点的时候,如果new_target==0,说明满足temp=target
def pathSum1(self, root: TreeNode, target: int) -> list[list[int]]:
result = []
temp = []
def dfs(node, new_target):
if not node:
return
temp.append(node.val)
new_target -= node.val
if not node.right and not node.left and new_target == 0:
result.append([_ for _ in temp])
dfs(node.left, new_target)
dfs(node.right, new_target)
temp.pop(-1)
dfs(root, target)
return result
class Solution:
def pathSum(self, root: TreeNode, target: int) -> List[List[int]]:
res = []
path = []
def recur(root, tar):
if not root:
return
s = tar - root.val
path.append(root.val)
if s == 0 and not root.left and not root.right:
res.append(list(path))
recur(root.left, s)
recur(root.right, s)
path.pop()
recur(root, target)
return res
共以下 16 个回答
注意深拷贝和浅拷贝之间的区别!
DFS
时间复杂度:O(N)
空间复杂度:O(N)
下面代码
时间空间复杂度都为O(n)
时间:O(n^2),空间:O(n)
时间复杂度 log(n)