二叉树 | 路经总和 | leecode刷题笔记

发布于:2023-01-21 ⋅ 阅读:(495) ⋅ 点赞:(0)

跟随carl代码随想录刷题
语言:python


如果需要搜索整棵二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。——代码随想录

112. 路径总和

题目:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false
叶子节点 是指没有子节点的节点。

题目分析

完整代码如下

# 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 hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        def isornot(root, targetSum):
            if (not root.left) and (not root.right):
                if targetSum == 0:
                    return True
                else:
                    return False
            if root.left:
                targetSum -= root.left.val
                if isornot(root.left, targetSum):
                    return True
                targetSum += root.left.val  # 如果执行到这一步,说明上面哪条路径并不符合,因此需要把减掉的值加回来
            if root.right:
                targetSum -= root.right.val
                if isornot(root.right, targetSum):
                    return True
                targetSum += root.right.val
            return False
        
        if root == None:
            return False
        else:
            return isornot(root, targetSum - root.val)         

113. 路径总和 II

题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
👉示例:
在这里插入图片描述
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

题目分析

代码运行流程图:

请添加图片描述

完整代码如下

# 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]]:
        def traversal(cur, remain):
            if not cur.left and not cur.right:
                if remain == 0:
                    result.append(path[:])  # 这一步很关键`path[:]`,不是`path`
                return

            if cur.left:
                path.append(cur.left.val)
                traversal(cur.left, remain - cur.left.val)
                path.pop()  # 如果走到这一步,说明上述路径不符合要求,所以要回溯

            if cur.right:
                path.append(cur.right.val)
                traversal(cur.right, remain - cur.right.val)
                path.pop()  # 回溯


        result , path = [], []
        if not root:
            return []
        path.append(root.val)
        traversal(root, targetSum - root.val)
        return result
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到