问题:
Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1 / \ 2 3
Return 6
.
首先,这道题的解决方案是用递归。对于一棵树来说,maximum path可能是经过root、贯穿左右的一条path;有可能是一条经过root但不贯穿的path(只有左边或者只有右边);也由可能是一条只在一边的path。但值得注意的是,如果是一条贯穿左右的path,则在我们recurse on left subtree and right subtree的时候,一定要选择第二种情况,即经过root但不管穿的path,把他们组合起来才变成一条贯穿的。所以,代码如下。
代码:
class Solution {
public:
int maxPathSumHelper(TreeNode *root, int &result) {
if (!root)
return 0;
int l = maxPathSumHelper(root->left, result);
int r = maxPathSumHelper(root->right, result);
int arch = l + r + root->val;
int single = max(root->val, max(l + r) + root->val);
result = max(result, max(arch, single));
return single;
}
int maxPathSum(TreeNode *root) {
int result = INT_MIN;
if (!root) return 0;
maxPathSumHelper(root, result);
return result;
}
};
注意,maxPathSumHelper返回的是single。这就是我上面说的原因:因为我们要用这个返回值来组合一条arch,所以必须是single。但也不用担心,因为我们早在上一行就已经把max放在了result里面,所以没关系。这个递归稍稍不同于一般的递归:它的返回值和我们真正要的东西不是用一个东西。这里的返回值是用来进一步递归的,而不是真正我们需要返回的东西。