113. 路径总和 II
原始题目链接:https://leetcode-cn.com/problems/path-sum-ii/
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
返回:
解题思路:
这道题是二叉树搜索问题,使用回溯法可以解决该类问题。
回溯:树的遍历+路径记录。
树的遍历:一般使用先序遍历,即根、左、右的顺序遍历树中的所有节点。
路径记录:在先序遍历的过程中,记录从根节点到当前节点所走过的节点路径。记录的过程中满足题目中的条件要求的路径,就是候选答案,将该路径加入答案列表中。
详细算法流程:
pathSum(root, sum) 函数:最外层的调用函数,返回值是所有满足条件的路径列表。
backtrack(root, cur_sum)函数:
- 递推参数:当前节点root,当前目标值cur_sum
- 终止条件:空节点,直接返回
- 路径更新
- 目标值更新
- 条件判断
- 遍历子节点
- 向上回溯
代码实现:
# Definition for a binary tree node.
# 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, targetSum: int) -> List[List[int]]:
# 初始化答案列表和遍历过程中当前路径的列表
res, path = [], []
# 定义一个回溯函数:改函数的功能是遍历树中的节点记录遍历的路径,并且判断是否满足给定的目标和的路径
def backtrack(root, cur_sum):
"""
root是当前传进来的节点
cur_sum记录的是遍历到当前节点后,剩下的目标和
"""
# 回溯结束条件
if not root:
return
# 把当前节点记录当当前路径列表中
path.append(root.val)
# cur_sum要减掉当前节点的值
cur_sum -= root.val
# 判断是否满足题目中路径和的要求,满足就把结果加入到结果列表res中
# 不满足则继续遍历,注意是要到叶子节点,所以也要加入判断是否达到叶子节点
if cur_sum == 0 and not root.left and not root.right:
res.append(path.copy())
# 不满足条件就继续遍历
backtrack(root.left, cur_sum)
backtrack(root.right, cur_sum)
# 注意,根据题意的路径要求,向上回溯的时候需要把访问过的子节点去掉
path.pop()
# 调用backtrack函数
backtrack(root, targetSum)
# 返回答案
return res
参考文献:
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/