• 树-路径问题


    124. 二叉树中的最大路径和
    给定一个非空二叉树,返回其最大路径和。
    
    本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
    class Solution:
        def __init__(self):
            self.maxSum = float("-inf")
    
        def maxPathSum(self, root: TreeNode) -> int:
            def maxGain(node):
                if not node:
                    return 0
    
                # 递归计算左右子节点的最大贡献值
                # 只有在最大贡献值大于 0 时,才会选取对应子节点
                leftGain = max(maxGain(node.left), 0)
                rightGain = max(maxGain(node.right), 0)
                
                # 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
                priceNewpath = node.val + leftGain + rightGain
                
                # 更新答案
                self.maxSum = max(self.maxSum, priceNewpath)
            
                # 返回节点的最大贡献值,因为前面解决的左中右的问题。还有中左(左右)中右(左右)的大小比较问题没处理。
                return node.val + max(leftGain, rightGain)
       
            maxGain(root)
            return self.maxSum
    112. 路径总和
    给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例: 
    给定如下二叉树,以及目标和 sum = 225
                 / 
                4   8
               /   / 
              11  13  4
             /        
            7    2      1
    返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
    class Solution:
        def hasPathSum(self, root: TreeNode, sum: int) -> bool:
            if not root:
                return False
            if not root.left and not root.right:
                return sum == root.val
            return self.hasPathSum(root.left,sum-root.val) or self.hasPathSum(root.right,sum-root.val)
    113. 路径总和 II
    给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例:
    给定如下二叉树,以及目标和 sum = 225
                 / 
                4   8
               /   / 
              11  13  4
             /      / 
            7    2  5   1
    返回:
    
    [
       [5,4,11,2],
       [5,8,4,5]
    ]
    class Solution:
     
       
        def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
            li=[]
            if  root is None:
                return li
            def find(root,sum,path):
                sum-=root.val
                if root.left is None and root.right is None and sum==0:
                    li.append(path+[root.val])
                if root.left:
                    find(root.left,sum,path+[root.val])
                if root.right:
                    find(root.right,sum,path+[root.val])
            find(root,sum,[])
            return li
    129. 求根到叶子节点数字之和
    给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
    
    例如,从根到叶子节点路径 1->2->3 代表数字 123。
    
    计算从根到叶子节点生成的所有数字之和。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例 1:
    
    输入: [1,2,3]
        1
       / 
      2   3
    输出: 25
    解释:
    从根到叶子节点路径 1->2 代表数字 12.
    从根到叶子节点路径 1->3 代表数字 13.
    因此,数字总和 = 12 + 13 = 25.
    class Solution:
        def sumNumbers(self, root: TreeNode) -> int:
            if not root: return 0
            self.sum = 0
            def dfs(node,sum):
                if node.left:
                    dfs(node.left,sum+str(node.left.val))
                if node.right:
                    dfs(node.right,sum+str(node.right.val))
                if not node.left and not node.right:
                    self.sum += int(sum)
            dfs(root,str(root.val))
            return self.sum
    257. 二叉树的所有路径
    给定一个二叉树,返回所有从根节点到叶子节点的路径。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例:
    
    输入:
    
       1
     /   
    2     3
     
      5
    
    输出: ["1->2->5", "1->3"]
    
    解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
    class Solution:
        def binaryTreePaths(self, root: TreeNode) -> List[str]:
            if not root: return []
            res = []
            def helper(root, tmp):
                if not root.left and not root.right:res.append(tmp + [str(root.val)]) 
                if root.left:helper(root.left, tmp + [str(root.val)])
                if root.right:helper(root.right, tmp + [str(root.val)])
            helper(root, [])
            return ["->".join(a) for a in res]     
    好好学习,天天向上
  • 相关阅读:
    Photon Server 实现注册与登录(五) --- 服务端、客户端完整代码
    机器学习小白笔记系列——支持向量机
    机器学习小白笔记系列——条件随机场
    机器学习小白笔记系列——EM算法
    机器学习小白笔记系列——线性回归
    多元统计分析学习笔记——概论及数据描述知识点回顾
    ORACLE的SPFILE与PFILE
    简单的点餐系统
    Linux系统中CTG的安装,应用程序开发以及调试
    Netstat命令
  • 原文地址:https://www.cnblogs.com/topass123/p/13372008.html
Copyright © 2020-2023  润新知