【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

小结:

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

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