LeetCode路经总和Ⅱ
给你二叉树的根节点 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了