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

文章目录

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

题目

标题和出处

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

出处: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.hqwc.cn/news/299257.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程

0.背景 编写此文是因为在 Linux 上跑项目时报错&#xff1a; sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or highe&#xff08;此时已经安装了 python3&#xff09;。sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(&q…

路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

路径规划综述 1. 背景介绍 路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用&#xff0c;包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展&#xff0c;路径规划技术也在不断地得到改进和应用。 路径规划…

【文本处理】正则表达式

一、简介 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&…

2024年软考电子商务设计师如何备考?考什么?

一、电子商务设计师概述&#xff1f; 电子商务设计师属于软考中级资格考试&#xff0c;软考是由国家人力资源和社会保障部&#xff08;原人事部&#xff09;、工业和信息化部&#xff08;原信息产业部&#xff09;领导的国家级考试&#xff0c;其目的是&#xff0c;科学、公正…

Spring 依赖注入概述、使用以及原理解析

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖注入的使用示例及其原理 依赖注入 什么是依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;它用于实现对…

makefile教程(1)

makefile教程 makefile是什么&#xff1a; makefile是用户自行完成的IDE&#xff08;integrated development environment集成开发环境&#xff09;程序&#xff0c;与传统的操作系统下的编译不同&#xff0c;makefile可以通过用户自行安排&#xff0c;决定文件的编译顺序&am…

[C/C++]数据结构: 链式二叉树的构建及遍历

一: &#x1f4ac;二叉树的概念 1.1:&#x1f6a9; 概念 二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二…

【附源码】IM+AI都有哪些应用场景?这8个开源项目建议收藏

1、社交泛娱乐——【找搭子】 饭搭子、旅游搭子、遛狗搭子…这种新型的“搭子社交”在年轻群体中逐渐流行起来。区别于传统社交&#xff0c;搭子关系&#xff0c;陌生以上&#xff0c;友人未满&#xff0c;这种轻松的浅社交既能获得志趣相投的陪伴&#xff0c;又不用苦心经营彼…

电子电器架构刷写方案——General Flash Bootloader

电子电器架构刷写方案——General Flash Bootloader 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 注&#xff1a;文章1万字左右&#xff0c;深度思考者入&#xff01;&#xff01;&#xff01; 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免…

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控

一、背景与需求 在公共场所和大型活动的管理中&#xff0c;人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况&#xff0c;无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法&#xff0c;基于计算机视觉技术…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

Ubuntu20.04纯命令配置PCL(点云库)

Ubuntu20.04纯命令配置PCL&#xff08;点云库&#xff09; 最近在学习点云库&#xff08;PCL&#xff09;的使用&#xff0c;第一步就是在自己的电脑安装配置PCL。 首先&#xff0c;对于ubuntu 16.04以上版本&#xff0c;可以直接使用命令进行安装&#xff0c;新建好一个文件夹…