LintCode-分治-二叉树中的最大路径和

来源:互联网 发布:中国出口数据查询 编辑:程序博客网 时间:2024/05/19 23:11

点此进入题目

解题思路:该题目是求二叉树的最大路径和,即二叉树中链接在同一条路径上的节点值相加的最大值。那么这个路径有可能只在左子树中,有可能从左子树经过节点到右子树,也有可能在右子树中。所以需要判断。

解题过程:首先新建一个函数,求除节点外,左右子树节点那条路径和最大(该路径是从节点开始只包含在左子树或者右子树中的路径)。先求经过根节点的最大路径和,首先定义一个整形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;
      }
}

个人总结:我自己又令定义了一个新的函数,也会有别的办法,也有更简单的办法。

注意事项:需要注意的就是要理清思路,其余也没有多大的问题。

原创粉丝点击