打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
分裂二叉树的最大乘积

问题描述



来源:LeetCode第1339题

难度:中等

给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。树至少有 2 个节点,每个节点的值在 [1, 10000] 之间。

示例 :

问题分析



这题是删除二叉树中的一条边,让他变成两棵树,然后计算这两棵树的乘积,最后返回最大的乘积。这题我们还是自底往上的思路,首先计算二叉树中所有节点的和,然后从下往上不断的累加子树的和,相当于把子树砍掉,顺便计算砍掉的这棵子树和剩余的子树和的乘积。代码和上一题二叉树的坡度中介绍的也非常相似,来看下代码:

private long max = Integer.MIN_VALUE;//最大乘积
private long sum;// 二叉树中所有节点的和

public int maxProduct(TreeNode root) {
    sum = sum(root);
    dfs(root);
    int mod = (int1e9 + 7;
    return (int) (max % mod);
}

// 累加树中的所有节点值
public int sum(TreeNode node) {
    if (node == null)
        return 0;
    return node.val + sum(node.left) + sum(node.right);
}

// 返回子树和,包含当前节点
public int dfs(TreeNode root) {
    if (root == null)
        return 0;
    int leftSum = dfs(root.left);
    int rightSum = dfs(root.right);
    // 计算子树和,要加上当前节点。
    int total = leftSum + rightSum + root.val;
    // 计算两棵树的乘积,保存最大的即可。
    max = Math.max(max, (sum - total) * total);
    return total;
}

你点的每个赞,我都认真当成了喜欢
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
二叉树的几种存储方式(一个数组,指针形式,两个数组)
剑指offer(C++)-JZ84:二叉树中和为某一值的路径(三)(数据结构-树)
leetcode算法总结 —— DFS深度优先搜索
万字长文!二叉树入门和刷题看这篇就够了!
剑指offer 24 二叉树中和为某一值的路径 ★★★★
重建二叉树
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服