113. 路径总和 II Python


一、题目描述

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

二、代码

代码如下:

# 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: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        result = []
        def Sum(root,path):
            now_path = path.copy()
            now_path.append(root.val)
            if sum(now_path) == targetSum : #如果当前路径总和与目标相同,分2种情况
                    if root.left == None and root.right == None: # 当前节点是叶子结点
                        result.append(now_path)
                        print("result:",result)
                        return
                    else:# 不是叶子结点 ,继续遍历
                        if root.left:
                            Sum(root.left,now_path)
                        if root.right:
                            Sum(root.right,now_path)
            if sum(now_path) != targetSum: #路径总和与目标不同,继续遍历
                if root.left != None:
                    Sum(root.left,now_path)
                if root.right != None:
                    Sum(root.right,now_path)
                
        if root == None:
            return result
        Sum(root,[])
        print(result)
        return result

三、解题思路

本题基于对二叉树的遍历上进行判断,需要记录每一条从根节点到叶子结点路径的总和,本题解大致思路是遍历每一条到叶子结点的路径,用数组path记录当前路径。
需要注意的点有2个:
①该二叉树并不是一个搜索树,左右子树结点值完全随机,没有规律可言,所以必须从根节点到叶节点全部遍历;
②题目要求根节点到叶结点的路径和为目标值,在正常的遍历判断中,如果当前满足路径之和是目标值,还需要判断当前节点是不是叶节点。
最后将满足条件的当前路径path添加进入result中,返回result数组即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值