题意: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.
题解:设dp[root]为从root一直往下走的最大和,设最大路径为pathSum。
我们知道最大的路径必定以一个点作为中继节点,如例子中的1节点。
得到转移方程:
dp[root] = root->val + max(max(dp[root->left], dp[root->right]), 0);
其中要跟0比较,因为可能左右两个支路只会减少和,则不必要往下走。
则pathSum = max(pathSum, root->val + max(leftSum, 0) + max(rightSum, 0));
同样的,我们可能也不需要往左走或者往右走。
代码如下:
class Solution {
public:
int search(TreeNode* root) {
if(root == NULL) return 0;
int leftSum = search(root->left);
int rightSum = search(root->right);
pathSum = max(root->val+max(leftSum, 0)+max(rightSum, 0), pathSum);
//因为最大的path必定以一个节点做为中转节点,即从其左支路到节点,再从节点到右支路
return root->val+max(max(leftSum, rightSum), 0);
//返回从root一直往下走的最大和
}
int maxPathSum(TreeNode* root) {
pathSum = INT_MIN;
search(root);
return pathSum;
}
private:
int pathSum;
};