標籤:style blog color 問題 for 代碼
找書中權值和最大的路徑,至少包含一個點。
有點類似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 sum13 //second is the maximum subtree sum14 //path and subtree should contain at least one node15 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 result27 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。