给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
解题思路:
递归,涉及到树的题目一般采用递归的方式。
- 首先判断左子树的和,如果是负数就返回0
- 然后判断右子树的和,如果是负数就返回0
- 左右子树与根节点的值求和作为局部最大值
- 与历史局部最大值比较得到所有种的最大值
- 返回给上一层时只能选择一个子树,返回根节点值加左右子树的最大值
提交代码:(递归,Runtime: 92 ms, faster than 76.35 % )
class Solution:
def __init__(self):
self.maxSum = float("-inf")
def maxPathSum(self, root: TreeNode) -> int:
def maxdepth(root):
if not root:
return 0
leftsum = max(maxdepth(root.left), 0)
rightsum = max(maxdepth(root.right), 0)
sum = leftsum + rightsum + root.val
self.maxSum = max(sum, self.maxSum)
return max(leftsum, rightsum) + root.val
maxdepth(root)
return self.maxSum