码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode每日一题】2020.6.21 124. 二叉树中的最大路径和

时间:2020-06-21 21:42:33      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:https   分析   treenode   lan   local   pre   block   str   节点   

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

小结:

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

【LeetCode每日一题】2020.6.21 124. 二叉树中的最大路径和

标签:https   分析   treenode   lan   local   pre   block   str   节点   

原文地址:https://www.cnblogs.com/enmac/p/13174094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!