113. 路径总和 II

该博客介绍了一种使用回溯算法解决二叉树路径和问题的方法。题目要求找到二叉树中所有从根节点到叶子节点且路径和等于给定目标和的路径。解题思路包括定义回溯函数,通过递归遍历树节点,记录路径并判断条件,最终返回满足条件的路径列表。代码实现中展示了如何应用这个思路来解决问题。
摘要由CSDN通过智能技术生成

113. 路径总和 II

原始题目链接:https://leetcode-cn.com/problems/path-sum-ii/

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
在这里插入图片描述
返回:
在这里插入图片描述
解题思路:

这道题是二叉树搜索问题,使用回溯法可以解决该类问题。
回溯:树的遍历+路径记录。
树的遍历:一般使用先序遍历,即根、左、右的顺序遍历树中的所有节点。
路径记录:在先序遍历的过程中,记录从根节点到当前节点所走过的节点路径。记录的过程中满足题目中的条件要求的路径,就是候选答案,将该路径加入答案列表中。
详细算法流程:
pathSum(root, sum) 函数:最外层的调用函数,返回值是所有满足条件的路径列表。
backtrack(root, cur_sum)函数

  1. 递推参数:当前节点root,当前目标值cur_sum
  2. 终止条件:空节点,直接返回
  3. 路径更新
  4. 目标值更新
  5. 条件判断
  6. 遍历子节点
  7. 向上回溯

代码实现:

# 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值