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

Posted lalal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

小结:

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







以上是关于LeetCode每日一题2020.6.21 124. 二叉树中的最大路径和的主要内容,如果未能解决你的问题,请参考以下文章

[每日一题2020.06.21]leetcode #124 DFS二叉树

老男孩教育每日一题-124天:当我们使用ssh-keygen命令的时候,如何一键非交互生产密钥对呢?

老男孩教育每日一题-第68天-实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网

leetcode 每日一题 953. 验证外星语词典

Leetcode每日一题(3)

LeetCode每日一题