这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
难度 : 中等
问题描述
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5 输出:[]
示例 3:
输入:root = [1,2], targetSum = 0 输出:[]
提示:
树中节点总数在范围 [0, 5000] 内 -1000 <= Node.val <= 1000 -1000 <= targetSum <= 1000
解题思路
遇到以上问题,最先想到的是深度遍历(DFS)和广度遍历(BFS)以下是实现的具体代码: 以下方法并非完全自己想法,有些借鉴优秀的算法,个人认为,学会了变成自己的就是自己的了
DFS
非递归方法:
class Solution:
def pathSum(self, root: TreeNode, sum_: int) -> List[List[int]]:
if not root: return []
nums = [([root.val], root)]
res = []
while nums:
tmp, node = nums.pop()
if not node.right and not node.left and sum(tmp) == sum_:
res.append(tmp)
if node.right:
nums.append((tmp + [node.right.val], node.right))
if node.left:
nums.append((tmp + [node.left.val], node.left))
return res
递归
class Solution:
def pathSum(self, root: TreeNode, sum_: int) -> List[List[int]]:
def dfs(root, tmp, sum_):
if not root:
return
if not root.left and not root.right and sum_ - root.val == 0:
tmp += [root.val]
res.append(tmp)
dfs(root.left, tmp + [root.val], sum_ - root.val)
dfs(root.right, tmp + [root.val], sum_ - root.val)
res = []
dfs(root, [], sum_)
return res
BFS
class Solution:
def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]:
import collections
# 按照广度优先搜索遍历树
def BFS(root):
if not root:
return []
# 存放每个节点的队列,按照广度优先搜索遍历
queue = collections.deque()
queue.append(root)
# 存放每个节点到根节点root的距离,当某一个叶子节点到root处的距离等于targetSum时,满足要求,此时只需获取该叶子节点到root节点的路径即可
distance = collections.deque()
distance.append(root.val)
# 字典,返回的是某一结点的父亲节点,root节点的父亲节点是None。依次可找到任意节点到root节点的路径
parent = {root:None}
res = []
while queue:
node = queue.popleft()
d = distance.popleft()
if not node.right and not node.left:
if d == targetSum:
res.append(get_path(node, parent))
if node.left:
queue.append(node.left)
distance.append(node.left.val + d)
parent[node.left] = node
if node.right:
queue.append(node.right)
distance.append(node.right.val + d)
parent[node.right] = node
return res
# 由给定的node和parent字典返回其到root节点的路径,返回值为列表
def get_path(node, parent):
res = []
while node:
res.append(node.val)
node = parent[node]
return res[::-1]
return BFS(root)