zoukankan      html  css  js  c++  java
  • 【LeetCode每日一题】2020.6.21 124. 二叉树中的最大路径和

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

    给定一个非空二叉树,返回其最大路径和。

    本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

    示例:

    输入: [1,2,3]

    1
    /
    2 3

    输出: 6

    输入: [-10,9,20,null,null,15,7]

    -10
    /
    9 20
    /
    15 7

    输出: 42

    分析:

    ​ 本题中的路径指的并不是由根结点出发到叶子结点,树中任意的两个结点之间的路就称为路径。因此我们可以得到一个很清晰的递归结构:每个结点都有一个对自己的子树中的贡献值,而对于每个结点,最大路径和公式为:根结点值 + 左右子树的贡献值。

    ​ 贡献值公式中必须有当前根结点值,因为只有这样才可以进行递归计算。同时我们设置一个全局变量max_sum来统计最大路径和。

    代码(Python):

    class Solution:
        def maxPathSum(self, root: TreeNode) -> int:
            def max_gain(node: TreeNode) -> int:
                nonlocal max_sum
                if not node:
                    return 0
    
                left_gain = max(max_gain(node.left), 0)
                right_gain = max(max_gain(node.right), 0)
                # 更新
                price_newpath = node.val + left_gain + right_gain
                max_sum = max(max_sum, price_newpath)
                # 递归
                return node.val + max(left_gain, right_gain)
    
            max_sum = float('-inf')
            max_gain(root)
            return max_sum
    

    小结:

    ​ 做二叉树的题目时,必须要确保递归性,如果本题中我们在获取贡献值中加入 对本结点正负值的判断,这样就可以保证该结点存储了该子树的最大路径和。但是却让结构无法递归。因此我们选择用一个全局变量来保存最大路径和,而每个结点返回自己的“贡献值”。

  • 相关阅读:
    C博客作业00—我的第一篇博客
    C语言博客作业03函数
    C语言博客作业05指针
    快速分页:jsp标签pagertaglib
    JSP与Servlet的编解码
    初探Hibernate3源码读取配置文件
    截取图片的某个部分(C#源代码)
    使用MATLAB获取视频中每一帧的图像
    Windows下较为精确的计时方法
    [转]向Windows Phone 7手机部署应用程序
  • 原文地址:https://www.cnblogs.com/enmac/p/13174094.html
Copyright © 2011-2022 走看看