给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点输入: [1,2,3]
1
/ \
2 3
输出: 6
思路:
对于一个根节点,其最大值max()有三种情况:
1. result = val
2. result = val + max(left)
3. result = vla + max(right);
判断以当前节点为根结点的子树中的最大路径为:
1. max = val
2. max = val + max(left)
3. max = val + max(right);
4. max = val + max(left) + max(right);
代码:
class Solution {
public:
int maxPathSum(TreeNode* root) {
if(root == NULL)
return 0;
int max = root->val;
maxPathSumCore(root,max);
return max;
}
int maxPathSumCore(TreeNode* root,int &max)
{
TreeNode* left = root->left;
TreeNode* right = root->right;
int n_r =0;
int n_l =0;
int result = 0;
if(left == NULL && right ==NULL)
{
result = root->val;
}
if(left ==NULL && right != NULL)
{
n_r = maxPathSumCore(right,max);
if(n_r < 0)
{
result = root->val;
}else
{
result = root->val + n_r;
}
}
if(right == NULL && left !=NULL)
{
n_l = maxPathSumCore(left,max);
if(n_l < 0)
{
result = root->val;
}else
{
result = root->val + n_l;
}
}
if(right!=NULL &&left!=NULL)
{
n_r = maxPathSumCore(right,max);
n_l = maxPathSumCore(left,max);
int max_c = n_r>n_l?n_r:n_l;
if(max_c <0)
{
result = root->val;
}else
{
result = root->val +max_c;
}
}
if(root->val+ n_l+n_r >max)
{
max = root->val+ n_l+n_r;
}
if(root->val+ n_l >max)
{
max = root->val+ n_l;
}
if(root->val+n_r >max)
{
max = root->val+ n_r;
}
return result;
}
};