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
.
这道题是要求出二叉树任两个节点的路径中节点值累加起来最大的总和,可能两个节点是相同的,就变为一个节点的值,总之是要求出最大的路径和。
要想找出最大路径和,我们可以分别找出经过根节点左(右)孩子出发的单方向的最大路径和(这条路径没有经过左(右)孩子的左右两边),然后再决定根节点是否要加上这两个最大值,如果有负的单方向最大路径和就不会加上,如果为正,则加上根节点的值之后更新全局最大和。在每个孩子节点进行这样的查找操作后更新最大值,并返回该从该孩子节点出发的单向最大路径和,使得父节点可以进行类似的比较更新操作。
感觉这个思路有点绕,还是要花时间找出比较容易理解的方法来。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxPathSum(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if (root==NULL)
return 0;
maxSum = INT_MIN;
findMaxPathSum(root);
return maxSum;
}
int findMaxPathSum(TreeNode *root) { //找从root出发的左边或右边的最大和
if (root->val > maxSum)
maxSum = root->val;
if (root->left==NULL && root->right==NULL)
return root->val;
int maxLeft = INT_MIN;
int maxRight = INT_MIN;
if (root->left)
maxLeft = findMaxPathSum(root->left); //计算root左边的最大和
if (root->right)
maxRight = findMaxPathSum(root->right); //计算root右边的最大和
/* 判断加上左边、右边还是两边的最大和, 并更新最大值maxSum */
if (maxLeft>0)
root->val+maxLeft > maxSum ? (maxSum=root->val+maxLeft) : 0;
if (maxRight>0)
root->val+maxRight > maxSum ? (maxSum=root->val+maxRight) : 0;
if (maxLeft>0&&maxRight>0)
root->val+maxLeft+maxRight > maxSum ? (maxSum=root->val+maxLeft+maxRight) : 0;
/* 返回从root出发的单边的最大和 */
int pathSum = maxLeft > maxRight ? maxLeft : maxRight;
return pathSum>0 ? root->val + pathSum : root->val;
}
private:
int maxSum;
};