二叉树题目:分裂二叉树的最大乘积

news2025/2/11 14:19:39

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:分裂二叉树的最大乘积

出处:1339. 分裂二叉树的最大乘积

难度

6 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,删除一条边将二叉树分裂成两个子树,使得两个子树和的乘积最大。

返回两个子树和的最大乘积。由于答案可能会很大,将结果对 10 9 + 7 \texttt{10}^\texttt{9} + \texttt{7} 109+7 取模后返回。

注意应该在取模前将答案最大化,不是取模后将答案最大化。

示例

示例 1:

示例 1

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

示例 2:

示例 2

输入: root   =   [1,null,2,3,4,null,null,5,6] \texttt{root = [1,null,2,3,4,null,null,5,6]} root = [1,null,2,3,4,null,null,5,6]
输出: 90 \texttt{90} 90
解释:移除红色的边,得到 2 \texttt{2} 2 个子树,和分别是 15 \texttt{15} 15 6 \texttt{6} 6。它们的乘积为 90 \texttt{90} 90 15 × 6 \texttt{15} \times \texttt{6} 15×6)。

数据范围

  • 树中结点数目在范围 [2,   5 × 10 4 ] \texttt{[2, 5} \times \texttt{10}^\texttt{4}\texttt{]} [2, 5×104]
  • 1 ≤ Node.val ≤ 10 4 \texttt{1} \le \texttt{Node.val} \le \texttt{10}^\texttt{4} 1Node.val104

解法

思路和算法

删除一条边将二叉树分裂成两个子树之后,其中的一个子树为原二叉树的子树,只要知道二叉树的结点值总和与该子树的结点值总和,即可知道另一个子树的结点值总和并计算两个子树和的乘积。

计算二叉树的结点值总和可以使用深度优先搜索实现。二叉树的结点值总和为根结点与每个非空子树和的总和。

首先计算二叉树的结点值总和,然后再次遍历二叉树计算每个子树的结点值总和。对于每个子树,计算该子树的结点值总和与另一个子树的结点值总和的乘积。遍历结束之后即可得到最大乘积。

二叉树的所有结点值总和不会超出 32 32 32 位整数范围,但是两个子树和的乘积可能超出 32 32 32 位整数范围。为了避免计算最大乘积时溢出,有两种方案,一是使用 64 64 64 位整数存储最大乘积,二是利用数学性质维护最大乘积对应的两个子树和。此处使用第二种方案。

假设原二叉树的结点值总和为 x x x,两个子树和分别为 x 2 + y \dfrac{x}{2} + y 2x+y x 2 − y \dfrac{x}{2} - y 2xy,其中 x 2 > y > 0 \dfrac{x}{2} > y > 0 2x>y>0,两个子树和的乘积是 ( x 2 + y ) ( x 2 − y ) \Big(\dfrac{x}{2} + y\Big)\Big(\dfrac{x}{2} - y\Big) (2x+y)(2xy)。根据平方差公式,有 ( x 2 + y ) ( x 2 − y ) = x 2 4 − y 2 \Big(\dfrac{x}{2} + y\Big)\Big(\dfrac{x}{2} - y\Big) = \dfrac{x^2}{4} - y^2 (2x+y)(2xy)=4x2y2。由于 x x x 为原二叉树的结点值总和,因此 x x x 为定值,为了使两个子树的乘积最大, y y y 应尽量小,即两个子树和之差的绝对值应尽量小。当两个子树和之差的绝对值最小时,两个子树和的乘积最大。

利用数学性质,维护与二叉树的结点值总和的一半最接近的子树和,遍历结束之后即可得到两个子树和的最大乘积。

代码

class Solution {
    static final int MODULO = 1000000007;
    int sum = 0;
    int bestSplitSum = 0;

    public int maxProduct(TreeNode root) {
        sum = getSum(root);
        getSum(root);
        int product = (int) ((long) bestSplitSum * (sum - bestSplitSum) % MODULO);
        return product;
    }

    public int getSum(TreeNode node) {
        int curSum = node.val;
        TreeNode left = node.left, right = node.right;
        if (left != null) {
            curSum += getSum(node.left);
        }
        if (right != null) {
            curSum += getSum(node.right);
        }
        if (sum > 0 && Math.abs(curSum * 2 - sum) < Math.abs(bestSplitSum * 2 - sum)) {
            bestSplitSum = curSum;
        }
        return curSum;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。需要执行两次深度优先搜索,每次深度优先搜索的时间复杂度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吉他初学者学习网站搭建系列(7)——如何在线制作乐谱(扒歌)

文章目录 背景实现查和弦&渲染和弦编辑谱子保存谱子 成果 背景 相信很多音乐爱好者们在听到一首好听的歌或者曲子时&#xff0c;都有动手扒谱的冲动&#xff0c;但是&#xff0c;你电脑里并没有安装一些专业的扒谱软件&#xff0c;这个时候&#xff0c;你更倾向于有一个网…

cesium实现区域贴图及加载多个gif动图

1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图&#xff0c;如果能够将gif动图进行解析&#xff0c;获得时间序列对应的每帧图片&#xff0c;然后按照时间序列动态更新Billboard的纹理&#xff0c;即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…

[环境配置]win10关闭病毒和威胁防护防止乱删软件

搜索栏输入病毒和威胁即可看到 如果没有搜到您可以从菜单栏进到到Windows设置 选择更新和安全 点击后进到windows安全中心&#xff0c;随后进到到病毒和威胁防护 关闭所有选项

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近&#xff0c;我期待着变得舒适&#xff0c;拿起一本新书&#xff0c;享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索&#xff0c;当我们确切地知道我们正在寻找什么书名时&#xff0c;这很好&…

thinkphp6.0的workerman在PHP8.0下报错

一、我先升级了thinkphp6.0到最新版本&#xff1a; composer update topthink/framework二、结果提示我composer版本过低&#xff0c;需要升级到2&#xff0c;于是我又升级了composer composer self-update 三、我又升级了workerman: composer require topthink/think-work…

数字调制学习总结

调制&#xff1a;将基带的信号的频谱搬移到指定的信道通带内的过程。 解调&#xff1a;把指定信号通带内的信号还原为基带的过程。 1、2ASK调制 原理如下图所示&#xff0c;基带信号为单极不归零码&#xff0c;与载波信号相乘&#xff0c;得到调制信号。 调制电路可以用开关…

嵌入式中一文搞定C语言数据结构--跳表

大家好&#xff0c;今天分享一篇C语言数据结构相关的文章--跳表。 1. 什么是跳表 跳表是 链表 索引 的一种数据结构 &#xff0c;是以空间换取时间的方式&#xff0c;关于跳表参考: https://baike.baidu.com/item/跳表/22819833?fraladdin 2. 跳表概念 跳表在原有链表的基…

SPFA算法总结

知识概览 SPFA算法是Bellman_Ford算法的优化。时间复杂度一般是O(m)&#xff0c;最坏时间复杂度是O(nm)&#xff08;遇到网格图、菊花图&#xff09;&#xff0c;其中n是点数&#xff0c;m是边数。SPFA算法其实是单源最短路限制最小的算法&#xff0c;只要图中没有负环&#xf…

【MYSQL】MYSQL 的学习教程(八)之 12 种慢 SQL 查询原因

日常开发中&#xff0c;我们经常会遇到数据库慢查询。那么导致数据慢查询都有哪些常见的原因呢&#xff1f;今天就跟大家聊聊导致 MySQL 慢查询的 12 个常见原因&#xff0c;以及对应的解决方法&#xff1a; SQL 没加索引SQL 索引失效limit 深分页问题单表数据量太大join 或者…

一起玩儿物联网人工智能小车(ESP32)——13. 用ESP32的GPIO控制智能小车运动起来(一)

摘要&#xff1a;本文更深入的讲述了GPIO的相关知识&#xff0c;并完成了导线连接工作&#xff0c;为下一步的软件开发做好了准备。 通用输入输出端口&#xff08;GPIO&#xff1a;General Purpose Input/Output Port&#xff09;&#xff0c;在前面已经有了初步的介绍&#xf…

C++ 比 C语言增加的新特性 3 之 命名空间namespace

1. 命名空间 1.1 命名空间 又称为“名字空间”&#xff0c;在内存&#xff08;全局&#xff09;中取一块区域并对其进行命名 实际例子&#xff1a; 同一个班级&#xff0c;两个同姓的人&#xff0c;例如&#xff1a;张三和张三&#xff0c;其中一个张三座位是在讲台右边&am…

公开100GB数据,日产汽车遭勒索组织“撕票”

Bleeping Computer 网站消息&#xff0c;Akira 勒索软件团伙声称成功入侵了日本汽车制造商日产汽车澳大利亚分公司的内部网络系统。 12 月 22 日&#xff0c;Akira 勒索软件团伙在其泄漏博客上添加了一个新的“受害者”&#xff0c;并表示其成员从日产汽车制造商的内部网络系统…

docker的一些思考

1.docker是啥&#xff1f; 2.镜像执行流程 3.一些疑惑和解答 1. 2.

软件测试面试--说一个印象最深的bug?

其实&#xff0c;面试官并不关心你描述的这个bug是否真的有价值&#xff0c;或有多曲折离奇&#xff1f;他只是&#xff1a; 1.了解你平时工作中的测试能力 所以&#xff0c;这就要求的你平时工作中遇到bug时试着自己去定位&#xff0c;定位bug的过程远比你的单纯的执行测试用…

【隐私保护】使用Python从文本中删除个人信息:第一部分

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

销售如何挖掘客户?有哪些方法?

在当今竞争激烈的市场环境中&#xff0c;客户资源的挖掘已经成为企业生存和发展的关键。销售人员需要掌握一定的技巧和方法&#xff0c;以有效地发掘潜在客户&#xff0c;提高销售业绩。以下分享一些挖掘客户的常用方法&#xff0c;帮助销售人员更好地开展业务。 一、了解客户需…

matlab附加功能管理器安装蓝牙工具箱

由于最近需要做蓝牙仿真方面的东西&#xff0c;需要用到matlab的蓝牙工具箱&#xff0c;根据官网例子输入&#xff1a; commSupportPackageCheck(BLUETOOTH);检测是否包含该工具箱&#xff0c;结果出现&#xff1a; 点击Add-On-Explorer出现&#xff1a; 网上搜索发现这是因为…

麦肯锡产品经理问题解决流程终极指南

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案&#xff1f;秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程&#xff0c;该流程专为希望提升水平的产品经理量身定制。 01. 麦…

周末两个比赛3个小题

周末安洵和nctf&#xff0c;因为不是学生也没报名拿附件作了一把。 安洵/pwn/side_channel , initiate 安洵的题很好&#xff0c;唯一的问题是把几乎所有的&#xff0c;有没有必要的都放了远程&#xff0c;而且服务器很差&#xff0c;好多题不是不会而是连不上。 这个题估计…

vivado 多周期路径与时钟相移

多周期路径与时钟相移 有时&#xff0c;必须在具有相同时钟域的两个时钟域之间定义定时约束时钟周期&#xff0c;但两个时钟之间的相移。在这些情况下&#xff0c;理解正时引擎使用的默认设置和保持关系。如果没有仔细调整两个时钟之间的相移可能导致两个时钟间的逻辑约束过大…