这个路径要么出现在子树上要么穿过当前根节点,对于穿过根节点的情况只需要找到左侧最大的分支和右侧最大的分支合并起来即可(如果小于0就不合并浙一分支)。
用老演员-0x3f3f3f3f来表示不存在。
因为C++11支持initializer_list, std::max可以放很多参数了。
class Solution {
public:
int maxX(TreeNode* root, TreeNode* combine_root)
{
if(nullptr == root) return -0x3f3f3f3f;
auto val = root->val;
auto lval = maxX(root->left, combine_root);
auto rval = maxX(root->right, combine_root);
if(root != combine_root){
val += max({lval, rval, 0});
}
else{
if(lval > 0)
val += lval;
if(rval > 0)
val += rval;
}
return val;
}
int maxPathSum(TreeNode* root) {
if(root == nullptr) return -0x3f3f3f3f;
return max({maxPathSum(root->left), maxPathSum(root->right), maxX(root, root)});
}
};