给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
//前序递归遍历,返回值为最大子树的路径和(不包括节点本身)
int maxSubPath(TreeNode *root, int &maxSum)
{
if(NULL == root) return 0;
int leftSub = maxSubPath(root->left, maxSum);
int rightSub = maxSubPath(root->right, maxSum);
int totalSub = 0;
if(leftSub > 0 || rightSub > 0)
{
totalSub = max(leftSub, rightSub)+root->val;
}
else
{
totalSub = root->val;
} //此处确定返回值
int val = root->val;
if(leftSub > 0) val += leftSub;
if(rightSub > 0) val += rightSub;
maxSum = max(maxSum, val); //不断更新最大路径
return totalSub;
}
public:
int maxPathSum(TreeNode* root) {
int maxSum = INT_MIN;
maxSubPath(root, maxSum);
return maxSum;
}
};
先考虑子问题:求解以每一个节点为上端点的情况下,最大的路径和。即路径只能左右拐弯,而不能上下拐弯。此时子问题和最大和子数组很相似。
然后本体就很好做了。