/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#define neg -10000
struct Node
{
int val1;
int val2;
Node():val1(neg),val2(neg){};
};
class Solution {
public:
Node maxPath(TreeNode *root )
{
Node result;
if(root->left == NULL && root->right == NULL)
{
result.val1=result.val2=root->val;
return result;
}
Node LN;
Node RN;
if( root->left != NULL)
{
LN=maxPath(root->left);
}
if( root->right != NULL )
{
RN=maxPath(root->right);
}
int tmp=max(LN.val1,RN.val1);
if( (root->val >0 || root->val < 0) && tmp < 0)
{
result.val1=root->val;
}
else
{
result.val1=root->val + tmp;
}
result.val2=max(max(max(LN.val2,RN.val2),LN.val1+RN.val1+root->val),result.val1);
return result;
}
int maxPathSum(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
Node result=maxPath(root);
return result.val2;
}
};