LeetCode路经总和Ⅱ

113. 路径总和 II

给你二叉树的根节点 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

输出:[]

思路:

  这道题和129. 求根节点到叶节点数字之和 很像,只不过那一题是将数值拼接而得到值,这一题是将数值相加。所以思路几乎是一模一样的,我们还是用递归的方式,每一个节点继承上面节点传来的路径,将自己的值加入总路径再传给下一个节点。当递归进入到叶子节点时,此时我们判断此时累计的路径所加出的结果是不是等于题目要求的targetSum,如果是,则保存这一路径。

  特别注意的是,如果某一时刻累计路径的值等于targetSum时,我们还要判断它是不是叶子节点,如果不是叶子节点,就说明这个路径提前加到了targetSum,也不满足题意。

  另外,递归函数一共有两个参数,一个是当前节点,另一个就是累计路径。我之所以强调路径而不是和,因为最终我们需要返回路径,所以我们通过这种方式来保留。

代码:

class Solution:

    def pathSum(self, root: Optional[TreeNode], targetSum: int) ~> List[List[int]]:

        res=[]#结果列表res

        def di(root,has):

            if sum(has)==targetSum and not root.left and not root.right: 
                    #如果此时和满足目标,且是叶子节点

                res.append(has)#将这个路径加入结果列表

                return

            #其他情况

            if root.left:#如果有左子节点,继续递归左子节点

                di(root.left,has+[root.left.val])

            if root.right:

                di(root.right,has+[root.right.val])

        #正式开始

        if not root:return []

        di(root,[root.val])#调用递归函数,参数为根节点root和它的值

        return res
posted @   JunanP  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示