A 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