/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
// rule in result vector during iteration:
// single path: 0; ----> v0
// cross path: 1; ----> v1
// single point: 2; ----> v2
// lonely path: 3; ----> v3
class Solution {
public:
int maxPathSum(TreeNode *root) {
vector<int> *rv = mps(root);
int r = miv(*rv);
delete rv;
return r;
}
vector<int> *mps(TreeNode *root) {
if(!root) return NULL;
vector<int> *ret = new vector<int>;
vector<int> *lr = mps(root->left);
vector<int> *rr = mps(root->right);
vector<int> v0;
v0.push_back(root->val);
if(lr) v0.push_back(root->val + (*lr)[0]);
if(rr) v0.push_back(root->val + (*rr)[0]);
vector<int> v1;
if(lr) v1.push_back((*lr)[1]);
if(rr) v1.push_back((*rr)[1]);
if(lr && rr) v1.push_back((*lr)[0] + (*rr)[0] + root->val);
vector<int> v2;
v2.push_back(root->val);
if(lr) v2.push_back((*lr)[2]);
if(rr) v2.push_back((*rr)[2]);
vector<int> v3;
if(lr) {
v3.push_back((*lr)[0]);
v3.push_back((*lr)[3]);
}
if(rr) {
v3.push_back((*rr)[0]);
v3.push_back((*rr)[3]);
}
ret->push_back(miv(v0));
ret->push_back(miv(v1));
ret->push_back(miv(v2));
ret->push_back(miv(v3));
delete lr;
delete rr;
return ret;
}
// max in vector
int miv(vector<int> l) {
int m = INT_MIN;
vector<int>::const_iterator cit = l.begin();
while(cit != l.end()) {
m = *cit > m ? *cit : m;
cit ++;
}
return m;
}
};