Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1
/
2 3
return6
#define max(x,y,z) (x>y?x:y)>z?(x>y?x:y):z
class Solution {
public:
int maxPathSum(TreeNode *root) {
if (root == NULL)
return INT_MIN;
Max = LONG_MIN;
findmax(root);
return Max;
}
int findmax(TreeNode *root)
{
int left = 0, right=0;
if (root->left == NULL && root->right == NULL)
{
Max = Max<root->val?root->val:Max;
return root->val;
}
if (root->left != NULL)
left = findmax(root->left);
if (root->right != NULL)
right = findmax(root->right);
int res = max(root->val, root->val+left, root->val+right);
int tmp = root->val+left +right;
Max = max(Max, res, tmp);
return res;
}
long Max;
};
测试
#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
#define max(x,y,z) (x>y?x:y)>z?(x>y?x:y):z
class Solution {
public:
int maxPathSum(TreeNode *root) {
Max = LONG_MIN;
findmax(root);
return Max;
}
int findmax(TreeNode *root)
{
if (root == NULL)
return INT_MIN;
int left = 0, right=0;
if (root->left == NULL && root->right == NULL)
{
Max = Max<root->val?root->val:Max;
return root->val;
}
if (root->left != NULL)
left = findmax(root->left);
if (root->right != NULL)
right = findmax(root->right);
int res = max(root->val, root->val+left, root->val+right);
int tmp = root->val+left +right;
Max = max(Max, res, tmp);
cout<<"root "<<root->val<<"left "<<left<<"right "<<right<<endl;
cout<<"res "<<res<<endl;
return res;
}
long Max;
};
int main()
{
TreeNode * root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(-3);
root->right->left = new TreeNode(-1);
root->right->right = new TreeNode(2);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
Solution s;
int res = s.maxPathSum(root);
cout<<res<<endl;
}