【LeetCode 算法刷题笔记-路径篇】

1.0112. 路径总和

1.1 题目大意

描述:给定一个二叉树的根节点 root 和一个值 targetSum。

要求:判断该树中是否存在从根节点到叶子节点的路径,使得这条路径上所有节点值相加等于 targetSum。如果存在,返回 True;否则,返回 False。

说明:

树中节点的数目在范围[0,5000]

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

解题思路

按照题意,是从根节点的值累加叶节点的值是否等于每个值,首先判断根节点是否存在,然后开始依次往下找到最底层的节点,即既没有左节点,也没有右节点的节点,依次累加,满足累加值等于指定值,累加到的那个节点既没有左节点,也没有右节点。

# 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], target: int) -> bool:
        if not root:
            return False
        
        return self.dfs(root,target,[root.val])
    
    def dfs(self,root,target,path):
        if not root:
            return False
        if sum(path)==target and not root.left and not root.right:
            return True
        left_flag,right_flag=False,False
        if root.left:
            left_flag=self.dfs(root.left,target,path+[root.left.val])
        if root.right:
            right_flag=self.dfs(root.right,target,path+[root.right.val])
        return left_flag or right_flag

2.0113. 路径总和 II

2.1 题目大意

描述:给定一棵二叉树的根节点 root 和一个整数目标 targetSum。

要求:找出「所有从根节点到叶子节点路径总和」等于给定目标和 targetSum 的路径。

说明:

叶子节点:指没有子节点的节点。

树中节点的数目在范围[0,5000]

输入: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]]:
        res,path=[],[]
        def recur(root,tar):
            if not root:
                return
            path.append(root.val)
            tar-=root.val
            if tar==0 and not root.left and not root.right:
                res.append(list(path))
            recur(root.left,tar)
            recur(root.right,tar)
            path.pop()

        recur(root,targetSum)
        return res

3.0101. 对称二叉树

3.1 题目大意

描述:给定一个二叉树的根节点 root。

要求:判断该二叉树是否是左右对称的。

说明:

树中节点数目在范围[1,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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        def recur(left,right):
            if not left and not right:
                return True
            if not right or not left or left.val!=right.val:
                return False
            return recur(left.left,right.right) and recur(left.right,right.left)
        return recur(root.left,root.right)

1.0124. 二叉树中的最大路径和

1.1 题目大意

描述:给定一个二叉树的根节点 root。

要求:返回其最大路径和。

说明:

路径:从树中的任意节点出发,沿父节点------子节点连接,到达任意节点的序列。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。

路径和:路径中各节点值的总和。

# 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 maxPathSum(self, root: Optional[TreeNode]) -> int:
        ans=-inf
        def dfs(root):
            if not root:
                return 0
            l_val=dfs(root.left)
            r_val=dfs(root.right)

            nonlocal ans
            ans=max(ans,l_val+r_val+root.val)
            return max(max(l_val,r_val)+root.val,0)
        dfs(root)
        return ans
相关推荐
C++忠实粉丝9 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
祁思妙想27 分钟前
10.《滑动窗口篇》---②长度最小的子数组(中等)
leetcode·哈希算法
福大大架构师每日一题38 分钟前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
EterNity_TiMe_1 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
dr李四维1 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
机器学习之心1 小时前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds1 小时前
FIFO和LRU算法实现操作系统中主存管理
算法
alphaTao2 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian2 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek3 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust