给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3] 1 / \ 2 3 输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 输出: 42
分为两种情况:
1.若当做根节点:
则分别求出两个子树的路径和leftsum和rightsum。
两个数如果大于0的话就加上路径,如果小于的话则不加。
2.不当做根节点:
则只需要处理三条路径中最长的一条即可。
代码如下:
/**
* 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 {
public:
int maxPathSum(TreeNode* root) {
int Max=-0x3f3f3f3f;
FindMax(root,Max);
return Max;
}
int FindMax (TreeNode* root,int &Max)
{
if(root==NULL)
{
return 0;
}
int leftsum=0,rightsum=0;
if(root->left)
leftsum=FindMax(root->left,Max);
if(root->right)
rightsum=FindMax(root->right,Max);
int sum=0;
if(leftsum>=0)
sum+=leftsum;
if(rightsum>=0)
sum+=rightsum;
sum+=root->val;
Max=max(Max,sum);
return max(root->val,max(root->val+leftsum,root->val+rightsum));
}
};