二叉树题目:最大二叉树 II

news2024/10/6 0:25:54

文章目录

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

题目

标题和出处

标题:最大二叉树 II

出处:998. 最大二叉树 II

难度

5 级

题目描述

要求

如果一个树满足其中每个结点的值都大于其子树中的任何其他值,则这样的树为最大树。

给定最大树的根结点 root \texttt{root} root 和一个整数 val \texttt{val} val

就像之前的问题那样,给定的树是从列表 a \texttt{a} a root   =   Construct(a) \texttt{root = Construct(a)} root = Construct(a))递归地使用下述 Construct(a) \texttt{Construct(a)} Construct(a) 过程构造的:

  • 如果 a \texttt{a} a 为空,返回 null \texttt{null} null
  • 否则,令 a[i] \texttt{a[i]} a[i] a \texttt{a} a 的最大元素。创建值为 a[i] \texttt{a[i]} a[i] 的根结点 root \texttt{root} root
  • root \texttt{root} root 的左子树将被构建为 Construct([a[0],   a[1],   ...,   a[i   -   1]]) \texttt{Construct([a[0], a[1], ..., a[i - 1]])} Construct([a[0], a[1], ..., a[i - 1]])
  • root \texttt{root} root 的右子树将被构建为 Construct([a[i   +   1],   a[i   +   2],   ...,   a[a.length   -   1]]) \texttt{Construct([a[i + 1], a[i + 2], ..., a[a.length - 1]])} Construct([a[i + 1], a[i + 2], ..., a[a.length - 1]])
  • 返回 root \texttt{root} root

请注意,我们没有直接给定 a \texttt{a} a,只有一个根结点 root   =   Construct(a) \texttt{root = Construct(a)} root = Construct(a)

假设 b \texttt{b} b 是将 a \texttt{a} a 复制后在末尾添加值 val \texttt{val} val 之后的列表。题目数据保证 b \texttt{b} b 中的值各不相同。

返回 Construct(b) \texttt{Construct(b)} Construct(b)

示例

示例 1:

示例 1

输入: root   =   [4,1,3,null,null,2],   val   =   5 \texttt{root = [4,1,3,null,null,2], val = 5} root = [4,1,3,null,null,2], val = 5
输出: [5,4,null,1,3,null,null,2] \texttt{[5,4,null,1,3,null,null,2]} [5,4,null,1,3,null,null,2]
解释: a   =   [1,4,2,3],   b   =   [1,4,2,3,5] \texttt{a = [1,4,2,3], b = [1,4,2,3,5]} a = [1,4,2,3], b = [1,4,2,3,5]

示例 2:

示例 2

输入: root   =   [5,2,4,null,1],   val   =   3 \texttt{root = [5,2,4,null,1], val = 3} root = [5,2,4,null,1], val = 3
输出: [5,2,4,null,1,null,3] \texttt{[5,2,4,null,1,null,3]} [5,2,4,null,1,null,3]
解释: a   =   [2,1,5,4],   b   =   [2,1,5,4,3] \texttt{a = [2,1,5,4], b = [2,1,5,4,3]} a = [2,1,5,4], b = [2,1,5,4,3]

示例 3:

示例 3

输入: root   =   [5,2,3,null,1],   val   =   4 \texttt{root = [5,2,3,null,1], val = 4} root = [5,2,3,null,1], val = 4
输出: [5,2,4,null,1,3] \texttt{[5,2,4,null,1,3]} [5,2,4,null,1,3]
解释: a   =   [2,1,5,3],   b   =   [2,1,5,3,4] \texttt{a = [2,1,5,3], b = [2,1,5,3,4]} a = [2,1,5,3], b = [2,1,5,3,4]

数据范围

  • 树中结点数目在范围 [1,   100] \texttt{[1, 100]} [1, 100]
  • 1 ≤ Node.val ≤ 100 \texttt{1} \le \texttt{Node.val} \le \texttt{100} 1Node.val100
  • 树中的所有值各不相同
  • 1 ≤ val ≤ 100 \texttt{1} \le \texttt{val} \le \texttt{100} 1val100

解法一

思路和算法

由于整数 val \textit{val} val 位于列表的末尾,因此和原最大二叉树相比,新最大二叉树多了一个结点 val \textit{val} val 且结点 val \textit{val} val 在最右侧,其余结点的左右相对位置不变。问题转换成在原最大二叉树中插入结点 val \textit{val} val 并保持最大二叉树的性质,然后返回新最大二叉树。

如果原最大二叉树为空,则新最大二叉树只有一个结点 val \textit{val} val。如果整数 val \textit{val} val 大于原最大二叉树的根结点值,则由于最大二叉树的根结点值大于任何其他结点值,因此整数 val \textit{val} val 大于原最大二叉树的任何结点值,将结点 val \textit{val} val 作为新最大二叉树的根结点,将原最大二叉树作为结点 val \textit{val} val 的左子树,即可得到新最大二叉树。

如果整数 val \textit{val} val 小于原最大二叉树的根结点值,则需要在原最大二叉树的右子树中插入结点 val \textit{val} val,在右子树中使用同样的方法寻找插入结点的位置。因此插入结点的过程是一个递归的过程,递归的终止条件是原最大二叉树为空或者待插入结点值大于原最大二叉树的根结点值,对于其余情况,则在原最大二叉树的右子树中递归地寻找插入结点的位置并完成插入操作。

代码

class Solution {
    public TreeNode insertIntoMaxTree(TreeNode root, int val) {
        TreeNode node = new TreeNode(val);
        if (root == null) {
            return node;
        }
        if (val > root.val) {
            node.left = root;
            return node;
        }
        root.right = insertIntoMaxTree(root.right, val);
        return root;
    }
}

复杂度分析

  • 时间复杂度: 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)

解法二

思路和算法

递归实现也可以改成迭代实现。由于给定的最大二叉树一定不为空,因此可以直接比较给定的整数 val \textit{val} val 和最大二叉树的根结点值的大小。如果整数 val \textit{val} val 大于原最大二叉树的根结点值,则将结点 val \textit{val} val 作为新最大二叉树的根结点,将原最大二叉树作为结点 val \textit{val} val 的左子树,即可得到新最大二叉树。

如果整数 val \textit{val} val 小于原最大二叉树的根结点值,则需要在原最大二叉树的右子树中插入结点 val \textit{val} val,需要首先找到插入结点 val \textit{val} val 的位置,然后插入结点 val \textit{val} val。寻找插入结点 val \textit{val} val 的位置时,需要在遍历过程中记录上一个结点 prev \textit{prev} prev 和当前结点 curr \textit{curr} curr,找到插入结点 val \textit{val} val 的位置之后,利用 prev \textit{prev} prev curr \textit{curr} curr 完成插入操作。具体操作如下。

  1. 如果 curr \textit{curr} curr 不为空且整数 val \textit{val} val 小于 curr \textit{curr} curr 的结点值,则插入结点 val \textit{val} val 的位置在 curr \textit{curr} curr 的右子树中,因此将 curr \textit{curr} curr 赋给 prev \textit{prev} prev,将 curr \textit{curr} curr 移动到右子结点。重复该操作直到 curr \textit{curr} curr 为空或者整数 val \textit{val} val 大于 curr \textit{curr} curr 的结点值,此时找到插入结点 val \textit{val} val 的位置。

  2. 找到插入结点 val \textit{val} val 的位置之后,整数 val \textit{val} val 一定小于 prev \textit{prev} prev 的结点值,且当 curr \textit{curr} curr 不为空时,整数 val \textit{val} val 一定大于 curr \textit{curr} curr 的结点值,因此将 prev \textit{prev} prev 的右子结点设为结点 val \textit{val} val,将结点 val \textit{val} val 的左子结点设为 curr \textit{curr} curr(当 curr \textit{curr} curr 为空时该操作同样适用)。

由于当整数 val \textit{val} val 小于原最大二叉树的根结点值时,插入结点的位置一定不是根结点,因此插入操作不会改变最大二叉树的根结点,原最大二叉树的根结点也是新最大二叉树的根结点。

使用迭代实现可以省略递归调用的栈空间,将空间复杂度降低到 O ( 1 ) O(1) O(1)

代码

class Solution {
    public TreeNode insertIntoMaxTree(TreeNode root, int val) {
        TreeNode node = new TreeNode(val);
        if (val > root.val) {
            node.left = root;
            return node;
        }
        TreeNode prev = null, curr = root;
        while (curr != null && val < curr.val) {
            prev = curr;
            curr = curr.right;
        }
        prev.right = node;
        node.left = curr;
        return root;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。寻找插入结点的位置最多需要遍历二叉树的每一层各一次,因此时间复杂度取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

【Python学习】—Python基础语法(六)

一、数据容器 Python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 二、list列表 列表的下标索引 嵌套列表的下标 my_list[aaa,1,True] print(my_list[0]) p…

电压检测芯片如何发挥作用,保护电路?纳米软件为您介绍工作原理

电压检测芯片是一种常见的集成电路芯片&#xff0c;用来监测电路中的电压变化&#xff0c;防止电路受到过电压和欠电压的损坏。电源电压检测芯片被广泛应用于各种电子设备中&#xff0c;比如手机、电脑、家电等&#xff0c;在电压监测、电源管理、电池电量检测、温度检测、电压…

3D模型怎么贴法线贴图?

1、法线贴图的原理&#xff1f; 法线贴图&#xff08;normal mapping&#xff09;是一种计算机图形技术&#xff0c;用于在低多边形模型上模拟高多边形模型的细节效果。它通过在纹理坐标上存储和应用法线向量的信息来实现。 法线贴图的原理基于光照模型。在渲染过程中&#x…

云表低代码:数字化转型的新风口,你了解多少?

自2019年起&#xff0c;低代码开发平台骤然引发热议&#xff0c;成为了科技领域的新宠。关于其定义和影响力&#xff0c;众说纷纭。有人将它誉为第四代编程语言&#xff0c;有人视它为开发模式的颠覆者&#xff0c;更有人认为它引领了企业管理模式的变革。这股热潮在社区内引发…

BIOS MBR UEFI GPT详解

先来看下名词 启动方式&#xff1a; Legacy&#xff1a;传统的。指的就是BIOS。 BIOS&#xff1a;Basic Input Output System&#xff0c;中文名称"基本输入输出系统"。 UEFI&#xff1a;Unified Extensible Firmware Interface&#xff0c;中文名称"统一的…

获取IEEE会议论文的标题和摘要

获取IEEE会议论文的标题和摘要 – 潘登同学的爬虫笔记 文章目录 获取IEEE会议论文的标题和摘要 -- 潘登同学的爬虫笔记 打开IEEE的高级搜索环境准备完整爬虫过程获取文章地址翻译函数获取文章标题和摘要 前几天接到导师的一个任务&#xff0c;要我去找找IEEE Transactions on K…

用低代码平台代替Excel搭建进销存管理系统

目录 一、用低代码平台搭建系统 1.需求调研 2.基于痛点梳理业务流程 3.低代码实现 &#xff08;1&#xff09;基础资料模块 &#xff08;2&#xff09;采购管理模块 &#xff08;3&#xff09;销售管理模块 &#xff08;4&#xff09;库存管理模块 &#xff08;5&…

快手联合阿里云构建容器混合云架构,轻松应对百万级秒杀

云布道师 摘要&#xff1a;快手电商在 2023 年某大 V 大促直播活动中&#xff0c;首次采用混合云弹性调度架构&#xff0c;应对大 V 百万级别秒杀峰值的计算资源需求。此次为【快手容器云 阿里云】的深度技术结合&#xff0c;在【快手电商直播秒杀】场景下的大规模首次应用。既…

Calcite 解析层详解

1、概述 用户的操作请求经过服务层的接收和封装被传递给calcite-core模块。 其中第一站就是解析层&#xff0c;它的作用主要是对SQL语句进行语法解析。 在这个过程中&#xff0c;初始的SQL字符串会被转化为Calcite内部的语法解析节点&#xff0c;为进一步的语法校验和优化做…

建筑木模板厂家直销 915*1830*15mm酚醛面板规格

建筑木模板在建筑施工中扮演着重要的角色&#xff0c;它是支撑混凝土浇筑和保证建筑结构稳定性的关键材料。作为一家专业的建筑木模板厂家直销商&#xff0c;我们引以为傲地推出了915*1830*15mm酚醛面板规格的产品。 我们的建筑木模板采用高质量的酚醛树脂胶粘剂和优质桉木木材…

低代码平台是什么意思?低代码平台如何设计与实现?

低代码这个词&#xff0c;也许许多人都相当陌生。低代码的正式提出可以追溯到2014年&#xff0c;当时全球最具影响力的独立研究咨询公司Forrester&#xff0c;正式界定了低代码的概念。低代码指可通过最少的手工编程就能快速交付应用程序&#xff0c;并能快速设置和部署用于参与…

centos启动tomcat 并指定jdk 版本

在tomcat的catalina.sh文件手动设置JAVA_HOME变量即可 例如&#xff1a; 前提是文件存在 保存配置重新启动tomcat

短说通用版V4.1.0测试版发布|新增全新马甲模块等新功能

大家好&#xff0c; 我是给你们带来惊喜的运营小番茄。 本期更新为短说通用版 4.1.0测试版。 本次V4.1.0版本新增功能有&#xff1a; ①学院免费课程支持发布评价 ②商城子系统商品支持使用积分抵扣 ③新增管理后台查看和导出评论功能 ④支持设置积分类型展示排序功能 …

记录一次时序数据库的实战测试

0x1.前言 ​ 本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果&#xff0c;作者不承担任何法律责任&#xff0c;请严格遵循中华人民共和国相关法律法规&#xff0c;禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台。 0x2.背景 ​ 在某…

99%的时间里使用的14个git命令

学习14个Git命令&#xff0c;因为你将会在99%的时间里使用它们 必须了解的命令整理 1&#xff0c;git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录&#xff0c;Git会将所有仓库的元数据存储在其中。 2&#xff0c;git clone 克隆…

【unity3D】Rect Transform组件

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Rect Transform组件 Rect Transform组件 基础知识详细介绍补充 基础知识 Rect Transform是Unity中的一个UI组件&#xff0c;用于…

商淘云:如何选择开源B2B2C多用户商城系统

选择开源B2B2C多用户商城系统是一个关键的决策&#xff0c;因为它将直接影响到您的电子商务平台的性能、功能和用户体验。以下是一些指导原则&#xff0c;可帮助您做出明智的选择。 首先&#xff0c;考虑系统的稳定性和安全性 选择一个经过广泛测试和验证的开源系统&#xff0…

node读取文件和获取路径

01.fs模块-读写文件 模块&#xff1a;类似插件&#xff0c;封装了方法和属性供我们使用 fs 模块&#xff1a;封装了与本机文件系统进行交互的&#xff0c;方法和属性 fs 模块使用语法如下&#xff1a;【fs模块为node自带&#xff0c;不需要手动安装】 加载 fs 模块&#xff0…

nginx解决vue项目开发跨域问题

1、为了模拟跨域的开发情况&#xff0c;本地可以起一个后台服务 const http require(http);const PORT 3200;// 创建一个 http 服务 const server http.createServer((request, response) > {response.end("hello world"); });// 启动服务, 监听端口 server.l…

Centos安装mongodb

mongodb官网 下载MongoDB cd /optwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgztar -xf mongodb-linux-x86_64-rhel70-4.4.2.tgz -C /usr/local/cd /usr/local/mv mongodb-linux-x86_64-rhel70-4.4.2 mongodb部署Mongodb 2.1. 创建目录 cd mo…