解题思路:该题目是求二叉树的最大路径和,即二叉树中链接在同一条路径上的节点值相加的最大值。那么这个路径有可能只在左子树中,有可能从左子树经过节点到右子树,也有可能在右子树中。所以需要判断。
解题过程:首先新建一个函数,求除节点外,左右子树节点那条路径和最大(该路径是从节点开始只包含在左子树或者右子树中的路径)。先求经过根节点的最大路径和,首先定义一个整形max=0和count=0,若左子树不空,那么count赋值为左子树的最大路径和,然后count>0时,max+=count。右子树类似。然后得到了经过根节点的最大路径和max。然后利用递归求左子树的最大路径和m1,和右子树的最大路径和m2,然后比较max,m1,m2的最大值。返回。
代码实现:
int BiggerChild(TreeNode * root)
{
if(root==NULL) return 0;
else{
int max=-1000000000,m1=0,m2=0;
if(root->left!=NULL) m1=root->left->val;
if(root->right!=NULL) m2=root->right->val;
m1+=BiggerChild(root->left);
max=m1;
m2+=BiggerChild(root->right);
if(max<m2) max=m2;
return max;
}
}
int maxPathSum(TreeNode * root)
{
if(root==NULL) return 0;
else{
int max=root->val,m1=-10000000,m2=-100000000,count;
if(root->left!=NULL)
{
count=root->left->val+BiggerChild(root->left);
if(count>0) max+=count;
m1=maxPathSum(root->left);
}
if(root->right!=NULL)
{
count=root->right->val+BiggerChild(root->right);
if(count>0) max+=count;
m2=maxPathSum(root->right);
}
if(max<m1) max=m1;
if(max<m2) max=m2;
return max;
}
}
个人总结:我自己又令定义了一个新的函数,也会有别的办法,也有更简单的办法。
注意事项:需要注意的就是要理清思路,其余也没有多大的问题。