leetcode1339. 分裂二叉树的最大乘积

leetcode1339. 分裂二叉树的最大乘积


给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。
由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5,6]
输出:110
解释:删除红色的边,得到 2 棵子树,和分别为 11 和 10 。它们的乘积是 110 (11*10)

我最开始想到的方法是,便利整个树,每遍历一个节点,就求出他的子树和,这样就可以通过所有节点的和,求出来当前的max,max=(all-left)left.或者max=(all-rightright).

class Solution {
    long allNodeSum=0;
    long max=0;
    long mod=1000000000+7;
    public int maxProduct(TreeNode root) {
        allNodeSum=allNodeSum(root,0);
        traverse(root);
        return (int)(max%mod);
    }
    public long allNodeSum(TreeNode root,long sumSubtree){
        if(root==null)return 0;;
        long tmp=sumSubtree;
        sumSubtree+=allNodeSum(root.left,tmp);
        sumSubtree+=allNodeSum(root.right,tmp);
        sumSubtree+=root.val;
        return sumSubtree;
    }
    public void traverse(TreeNode root){
        if(root==null)return ;
        long left=allNodeSum(root.left,0);
        max=Math.max((allNodeSum-left)*left,max);
        long right=allNodeSum(root.right,0);
        max=Math.max((allNodeSum-right)*right,max);
        traverse(root.left);
        traverse(root.right);
    }
}

但是仔细想想,其实通过一次遍历就能解决.一次遍历,把当前节点对应的树的所有节点和求出来,然后放到一个list里面.这样最后只需要遍历一次list就可以了.

class Solution {
    public int maxProduct(TreeNode root) {
        ArrayList<Long>list=new ArrayList<>();
        long allNodeSum=allNodeSum(root,list);
        long max=0;
        long mod=1000000000+7;
        for(long s:list){
            if(s==allNodeSum)continue;//得跳过第一个数
            max=Math.max((allNodeSum-s)*s,max);
        }
        return (int)(max%mod);
    }
    public long allNodeSum(TreeNode root,ArrayList<Long>list){
        if(root==null)return 0;;
        long tmp=root.val+allNodeSum(root.left,list)+allNodeSum(root.right,list);
        list.add(tmp);
        return tmp;
    }
    
}

leetcode 46/100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值