/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
/*
这里的node_max_sum要注意,它的返回值不是以传入的参数root为根的子树的max path sum!
而是指从root出发的路径的最大和,明白这一点很重要,否则这个代码写不出来。。别人也看不懂。
明确这一点之后,接着来分析,可以设置一个最大值的引用,在每次递归中判断更新最大值,也可以直接定义一个全局变量。
总之,记这个值为max_path_sum。
在获得从root->left和root->right出发的路径的max sum(记为left_sum和right_sum)之后,函数的返回值应该是:
root->val,left_sum, right_sum之中的最大值。
然后,由于题目要求求树中所有路径的最大和,所以要考虑路径经过root的情况,所以需要把max_path_sum和left_sum+right_sum+root->val的值,以及从root出发的路径的sum最大值相比较,将max_path_sum更新为这些值中的最大值。
此题折磨了我很长时间。。需要仔细体会。
所谓的最大和,就是从根节点出发的路径以及经过根节点的路径的和的最大值,再与之前求得的除根节点加入之前的最大值相比,较大的那个,
就是所要求的那个最大和,这是本题的基本思路。
*/
int max_path_sum = INT_MIN;
int node_max_sum(TreeNode *root)
{
if (root == NULL)
{
return 0;
}
int left_sum = node_max_sum(root->left);
int right_sum = node_max_sum(root->right);
int tmp = max(root->val, max(left_sum+(root->val), right_sum+(root->val)));
int tmp1 = max(root->val+left_sum+right_sum, tmp);
max_path_sum = max(max_path_sum, tmp1);
return tmp;
}
int maxPathSum(TreeNode *root) {
if (root == NULL)
return 0;
//int max_path_sum = INT_MIN;
node_max_sum(root);
return max_path_sum;
}
};