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

你可能感兴趣的:(leetcode)