/**
* 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更新爲這些值中的最大值。
此題折磨了我很長時間。。須要仔細體會。node
所謂的最大和,就是從根節點出發的路徑以及通過根節點的路徑的和的最大值,再與以前求得的除根節點加入以前的最大值相比,較大的那個,
就是所要求的那個最大和,這是本題的基本思路。函數
*/
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;
}it
int maxPathSum(TreeNode *root) {
if (root == NULL)
return 0;
//int max_path_sum = INT_MIN;
node_max_sum(root);
return max_path_sum;
}
};io