Given a non-empty binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
Example 1:
Input: [1,2,3] 1 / 2 3 Output: 6
Example 2:
Input: [-10,9,20,null,null,15,7] -10 / 9 20 / 15 7 Output: 42
给一个非空二叉树,找出最大路径和。
解法:递归,与常规path sum不同,这题的path sum可以不起始于root,也可以不终止于leaf。
Java:
public class Solution { int maxValue; public int maxPathSum(TreeNode root) { maxValue = Integer.MIN_VALUE; maxPathDown(root); return maxValue; } private int maxPathDown(TreeNode node) { if (node == null) return 0; int left = Math.max(0, maxPathDown(node.left)); int right = Math.max(0, maxPathDown(node.right)); maxValue = Math.max(maxValue, left + right + node.val); return Math.max(left, right) + node.val; } }
Python:
# Time: O(n) # Space: O(h), h is height of binary tree class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None class Solution(object): maxSum = float("-inf") # @param root, a tree node # @return an integer def maxPathSum(self, root): self.maxPathSumRecu(root) return self.maxSum def maxPathSumRecu(self, root): if root is None: return 0 left = max(0, self.maxPathSumRecu(root.left)) right = max(0, self.maxPathSumRecu(root.right)) self.maxSum = max(self.maxSum, root.val + left + right) return root.val + max(left, right)
C++:
class Solution { public: int maxPathSum(TreeNode* root) { int res = INT_MIN; helper(root, res); return res; } int helper(TreeNode* node, int& res) { if (!node) return 0; int left = max(helper(node->left, res), 0); int right = max(helper(node->right, res), 0); res = max(res, left + right + node->val); return max(left, right) + node->val; } };
Follow up: 返回最大路径,递归函数就不能返回路径和,而是返回该路径上所有结点组成的数组,递归的参数还要保留最大路径和,对左右子节点调用递归函数后得到的是数组,统计出数组之和,并且跟0比较,如果小于0,和清零,数组清空。
类似题目:
[LeetCode] 113. Path Sum II 路径和 II
[LeetCode] 437. Path Sum III 路径和 III
[LeetCode] 666. Path Sum IV 二叉树的路径和 IV
[LeetCode] 687. Longest Univalue Path 最长唯一值路径
[LeetCode] 129. Sum Root to Leaf Numbers 求根到叶节点数字之和