思路:这里面包含最优解和返回值不同的情况,最优解就是树的一条路径,可能不包含树的根节点,也许树的根节点就处在路径的中间,这样这个最优解就不能向上返回,因为其父节点树的最优解一定会经过树的根节点(如果包含其最优解一部分),所以,返回的值必须是根节点为端点的路径,这样有三种情况:
1)只是根节点;
2)左子树返回值(保证根节点为端点的路径) + 根节点;
3) 右子树返回值 (保证根节点为端点的路径)+ 根节点。
返回其中最大的一个值。
对于最优解,只要随时更新即可,对于当前树,通过 4 种情况更新最优解:
1)只是根节点的值;
2)左子树最优值(不保证根节点为端点的路径) + 根节点值;
3) 右子树返回值 (不保证根节点为端点的路径)+ 根节点值。
4)左子树返回值(不保证根节点为端点的路径)+ 右子树返回值 (不保证根节点为端点的路径) + 根节点值;最后只需要利用整棵树的最优值即可。
code :
class Solution {
public:
int maxValue(TreeNode *root,int &ret){
if(root->left == NULL && root->right == NULL){
if(ret < root->val)
ret = root->val;
return root->val;
}
int curValue = root->val, valLeft = 0, valRight = 0;
if(root->left != NULL){
valLeft = maxValue(root->left,ret);
if(valLeft >=0)
curValue += valLeft;
}
if(root->right != NULL){
valRight = maxValue(root->right,ret);
if(valRight >=0)
curValue += valRight;
}
ret = ret > curValue ? ret : curValue;
int t1 = valLeft < 0 ? root->val : root->val + valLeft;
int t2 = valRight < 0 ? root->val : root->val + valRight;
return t1 > t2 ? t1 : t2;
}
int maxPathSum(TreeNode *root) {
int ret = INT_MIN;
maxValue(root,ret);
return ret;
}
};