题目¶
原题地址: https://leetcode.com/problems/binary-tree-maximum-path-sum/
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 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 * 10^4].
- -1000 <= Node.val <= 1000
题目大意是,求二叉树节点和最大的路径,求二叉树的最长相同值的路径,只是将相同值的条件改为了路径上节点和最大
解法¶
类似二叉树最长相同值路径的题,这里是求任意路径的节点值的和,不过要增加一个限制, 那就是左右子树节点和先跟 0 比较,如果 < 0 的话,就取 0 表示放弃该子树 (因为是求节点和最大值,如果加上为负的子树的话,值反而会变小,丢弃为负的子树更合理) 也就是说,如果子树的节点值的和 < 0 的话,那它们的和就取 0。
这个思路的 Python 代码类似下面这样:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self._max_sum = -1001
self._path_sum(root)
return self._max_sum
def _path_sum(self, root):
if root is None:
return 0
left_sum = self._path_sum(root.left)
right_sum = self._path_sum(root.right)
# 如果子树的节点和 < 0,取 0 即舍弃这个子树
if left_sum < 0:
left_sum = 0
if right_sum < 0:
right_sum = 0
sum = root.val + left_sum + right_sum
if sum > self._max_sum:
self._max_sum = sum
return root.val + max(left_sum, right_sum)
Comments