题解
Hard
Tree, DFS
时隔两年,再次把我难住。作为深度优先搜索或者递归的一道练习题,还是很有价值的。
基本上这道题,递归的变量,有两个,一个是结果,另一个是从当前节点往一个方向延伸的最大和,这个容易想到。但有几处细节容易忽略。
比如在求一侧的最大和的时候,要把加和为负值的支段剪掉,那么就有了 max(0, maxDown())
.
class Solution {
public:
int maxPathSum(TreeNode* root) {
int res = INT_MIN;
maxDown(root, res);
return res;
}
int maxDown(TreeNode* node, int& res) {
if(!node) {
return 0;
}
int left = max(0, maxDown(node->left, res)); // prune negative branch
int right = max(0, maxDown(node->right, res));
res = max(res, left + right + node->val);
return node->val + max(left, right);
}
};