[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。