[Leetcode][Tree][Binary Tree Maximum Path Sum]

找书中权值和最大的路径,至少包含一个点。

有点类似LCA(最近公共祖先),树的问题关键是如何划分子问题,然后递归求解。

想到了可以返回两种结果,一个是单独路径的最大和,一种是子树的最大和,然后在求解的过程中不断的更新答案。

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     //first is the maximum path sum
13     //second is the maximum subtree sum
14     //path and subtree should contain at least one node
15     pair<int, int> findRes(TreeNode * root, int & res) {
16         pair<int, int> values = make_pair(INT_MIN, INT_MIN);
17         if (root == NULL) {
18             return values;
19         }
20         pair<int, int> lvalues = findRes(root->left, res);
21         pair<int, int> rvalues = findRes(root->right, res);
22         values.first = max(0, max(lvalues.first, rvalues.first)) + root->val;
23         
24         values.second = max(lvalues.second, rvalues.second);
25         int sum = root->val;
26         if (lvalues.first > 0) {
27             sum += lvalues.first;
28         }
29         if (rvalues.first > 0) {
30             sum += rvalues.first;
31         }
32         values.second = max(values.second, sum);
33         res = max(res, values.second);
34         res = max(res, values.first);
35         return values;
36     }
37     int maxPathSum(TreeNode *root) {
38         int res = INT_MIN;
39         findRes(root, res);
40         return res;
41     }
42 };

总结:CE了两次。。总是不小心打错单词。。哭。。。

WA了一次,其实当时想到了,如果树中的结点权值均为负数的时候,不应该把res初始化为0。

 

看了题解之后,恍然大悟,子树的值是不需要被返回的!于是又重写了一遍,争取把代码写的更简洁!

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     //findRes returns the maximum path sum ended with root.
13     int findRes(TreeNode *root, int & res) {
14         if (root == NULL) {
15             return 0;
16         }
17         int l = findRes(root->left, res);
18         int r = findRes(root->right, res);
19         int sum = root->val;
20         if (l > 0) {
21             sum += l;
22         }
23         if (r > 0) {
24             sum += r;
25         }
26         res = max(res, sum);//update the final result
27         if (l <= 0 && r <= 0) {
28             return root->val;
29         } else {
30             return max(l, r) + root->val;
31         }
32     }
33     int maxPathSum(TreeNode *root) {
34         int res = INT_MIN;
35         findRes(root, res);
36         return res;
37     }
38 };

一次AC。

posted @ 2014-07-05 13:08  poemqiong  阅读(150)  评论(0编辑  收藏  举报