弄清楚这道题中的path指的是什么是成功的关键。我就是在没弄清楚题意的情况下做了半天无用功。。。
这里的path指的是从树中的一个节点开始,沿着边走到另一个节点位置,所经历的所有节点组成一个path,同一个节点不能在path中出现2次,其实就是图中的path。
程序主体主需要对树进行一次dfs即可,在每个节点都要做一个决策:是否要从当前节点继续沿parent路径往上返回;如果返回,则最佳路径的决策留待上层解决;如果不返回,那么在当前节点处解决最佳路径。
pathStart返回的是以参数root为path的一端,另一端在root以下寻找,所能找到的最佳路径。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int res;
int pathStart(TreeNode* root)
{
if((root->left==NULL)&&(root->right==NULL))
{
if(root->val>res)
{
res=root->val;
}
return root->val;
}
int tmp=root->val;//save the value need to be further checked along parent path
int curVal=root->val;//save the value do not need to be further checked along parent path
if(root->left!=NULL)
{
//extend to left child
int v=pathStart(root->left);
if(v>=0)
{
if((root->val+v)>tmp)
{
tmp=root->val+v;
}
curVal+=v;
}
}
if(root->right!=NULL)
{
//extend to right child
int v=pathStart(root->right);
if(v>=0)
{
if((root->val+v)>tmp)
{
tmp=root->val+v;
}
curVal+=v;
}
}
if(curVal>res)
{
res=curVal;
}
//extend to parent
return tmp;
}
int maxPathSum(TreeNode *root) {
res=-(1<<31);
if(root==NULL)
{
return 0;
}
int tmp=pathStart(root);
if(tmp>res)
{
res=tmp;
}
return res;
}
};