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
思路:
解这道题的关键在于设计递归规则。考虑最简单的二叉树:
root / \ left right
在这种情况下,我们可以给出这个二叉树的所有组合可能:
1 root
2 roo+left
3 root+right
4 root+left+right
至于只有left和right的情况,我们将其归于left和right的递归中的root。为了找到整颗树的最大组合可能,我们设计递归的时候将left和right作为递归分支,这样在left和right有子树的时候就可以遍历整颗树了。
int maxPathSum(TreeNode *root, int &maxSum){
int maxLeft = 0, maxRight = 0;
if (root->left) maxLeft = maxPathSum(root->left, maxSum);
if (root->right) maxRight = maxPathSum(root->right, maxSum);
int maxBranch = maxLeft > maxRight ? max(maxLeft + root->val, root->val) : max(maxRight + root->val, root->val);
maxSum = max(maxSum, maxBranch);
maxSum = max(maxSum, maxLeft + maxRight + root->val);
return maxBranch;
}
int maxPathSum(TreeNode* root) {
int maxSum = INT_MIN;
maxPathSum(root, maxSum);
return maxSum;
}