LeetCode 124. Binary Tree Maximum Path Sum - 二叉树(Binary Tree)系列题8

path in a binary tree is a sequence of nodes where each pair of adjacent nodes in the sequence has an edge connecting them. A node can only appear in the sequence at most once. Note that the path does not need to pass through the root.

The path sum of a path is the sum of the node's values in the path.

Given the root of a binary tree, return the maximum path sum of any non-empty path.

Example 1:

Input: root = [1,2,3]
Output: 6
Explanation: The optimal path is 2 -> 1 -> 3 with a path sum of 2 + 1 + 3 = 6.

Example 2:

Input: root = [-10,9,20,null,null,15,7]
Output: 42
Explanation: The optimal path is 15 -> 20 -> 7 with a path sum of 15 + 20 + 7 = 42.

Constraints:

  • The number of nodes in the tree is in the range [1, 3 * 104].
  • -1000 <= Node.val <= 1000

题目对二叉树中一条路径path做了定义,路径是一个节点序列,相邻节点间由一条边相连,每个节点在路径中只能出现一次,路径不一定要通过根节点,也不一定要以叶节点开始或结束。路径和就是路径中所有节点值的和。要求找出树中最大的路径和。

根据以上对路径的描述,我们可以知道对于一个节点,经过该节点的具有最大路径和的路径是以下路径中的其中一条:

1)节点本身,即路径只有一个节点

2)节点本身 + 从左子节点开始往下具有最大和的那条路径

3)节点本身 + 从右子节点开始往下具有最大和的那条路径

4)从左子节点开始往下具有最大和的那条路径 + 节点本身 + 从右子节点开始往下具有最大和的那条路径。

以上4条路径和最大的那条就是经过那个节点的最大和路径,因此找出所有节点的最大和路径,再从中找出和最大的也就是整棵树中最大路径和。

因此本题可以用后序遍历法,当遍历到一个节点时,先递归调用等待左子树返回从左子节点开始往下具有最大和的那条路径,然再递归调用等待右子树返回从右子节点开始往下具有最大和的那条路径,然后就可以算出以上描述的4条路径的和,找出最大和。最后还要把“节点本身 + 从左子节点开始往下具有最大和的那条路径”和“节点本身 + 从右子节点开始往下具有最大和的那条路径”中的较大者返回给上层使用。

class Solution:
    def maxPathSum(self, root: Optional[TreeNode]) -> int:
        maxSum = -1000
        
        def helper(node):
            if not node:
                return 0
            
            nonlocal maxSum
            
            lsum = helper(node.left)
            rsum = helper(node.right)
            maxSum = max(maxSum, lsum + rsum + node.val)
            
            res = max(max(lsum + node.val, rsum + node.val), node.val)
            maxSum = max(maxSum, res)
            
            return res
        
        helper(root)
        
        return maxSum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值