二叉搜索树操作题目:二叉搜索树中的插入操作

文章目录

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

题目

标题和出处

标题:二叉搜索树中的插入操作

出处:701. 二叉搜索树中的插入操作

难度

3 级

题目描述

要求

给定二叉搜索树的根结点 root \texttt{root} root 和要插入树中的值 val \texttt{val} val,返回插入操作后的二叉搜索树的根结点。保证新值和原始二叉搜索树中的任意结点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。可以返回任意有效的结果

示例

示例 1:

示例 1.1

输入: root = [4,2,7,1,3], val = 5 \texttt{root = [4,2,7,1,3], val = 5} root = [4,2,7,1,3], val = 5
输出: [4,2,7,1,3,5] \texttt{[4,2,7,1,3,5]} [4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 1.2

示例 2:

输入: root = [40,20,60,10,30,50,70], val = 25 \texttt{root = [40,20,60,10,30,50,70], val = 25} root = [40,20,60,10,30,50,70], val = 25
输出: [40,20,60,10,30,50,70,null,null,25] \texttt{[40,20,60,10,30,50,70,null,null,25]} [40,20,60,10,30,50,70,null,null,25]

示例 3:

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

数据范围

  • 树中结点数目在范围 [0, 10 4 ] \texttt{[0, 10}^\texttt{4}\texttt{]} [0, 104]
  • -10 8 ≤ Node.val ≤ 10 8 \texttt{-10}^\texttt{8} \le \texttt{Node.val} \le \texttt{10}^\texttt{8} -108Node.val108
  • 所有值 Node.val \texttt{Node.val} Node.val 各不相同
  • -10 8 ≤ val ≤ 10 8 \texttt{-10}^\texttt{8} \le \texttt{val} \le \texttt{10}^\texttt{8} -108val108
  • 保证 val \texttt{val} val 在原始二叉搜索树中不存在

解法一

思路和算法

如果二叉搜索树为空,则插入结点之后,二叉搜索树中只有插入的结点,返回该结点即可。如果二叉搜索树不为空,为了在插入操作之后维持二叉搜索树的性质,需要比较根结点值和插入值,决定应该在根结点的哪个子树中插入结点。

  • 如果根结点值大于目标值,则应该在根结点的左子树中插入结点。

  • 如果根结点值小于目标值,则应该在根结点的右子树中插入结点。

上述过程是一个递归的过程。递归的终止条件是当前结点为空,此时返回插入的结点。对于其余情况,定位到应该插入结点的子树,对该子树调用递归,并用递归调用的结果更新当前结点的相应子树。

代码

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) {return new TreeNode(val);}if (root.val > val) {root.left = insertIntoBST(root.left, val);} else {root.right = insertIntoBST(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)

解法二

思路和算法

递归实现可以改成迭代实现。如果根结点为空,则返回插入的结点。当根结点不为空时,从根结点开始搜索,定位到插入结点的位置。搜索结束的条件是当前结点为空,此时需要定位到当前结点的父结点才能插入结点,因此在搜索过程中需要维护当前结点的父结点。

每一次搜索时,首先将父结点设为当前结点,然后执行如下操作,直到当前结点为空。

  • 如果当前结点值大于目标值,则应该在根结点的左子树中插入结点,因此将当前结点移动到左子结点。

  • 如果当前结点值小于目标值,则应该在根结点的右子树中插入结点,因此将当前结点移动到右子结点。

搜索结束时,比较父结点的值和目标值,决定插入的结点应该作为父结点的左子结点或者右子结点。

代码

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {TreeNode insertNode = new TreeNode(val);if (root == null) {return insertNode;}TreeNode node = root, parent = null;while (node != null) {parent = node;if (node.val > val) {node = node.left;} else {node = node.right;}}if (parent.val > val) {parent.left = insertNode;} else {parent.right = insertNode;}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.mzph.cn/news/654347.shtml

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

相关文章

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions,ExcelDataSetConfiguration,ExcelDataTableConfiguration和一个实用代码参考: using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…

别再做“背锅侠”!软件测试工程师被开发吐槽,如何应对?

作为一名软件测试工程师,我们的角色可以算是“战场上的后勤”,战役的胜败和所有团队人员都息息相关。但是难免碰到战役失败后,很多团队互相推脱的局面,而测试人员就是所有团队中的弱势群体,自然是首当其冲的背锅侠&…

扫雷游戏(C语言)

目录 一、前言: 二、游戏规则: 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言: 用C语言完成扫雷游戏对于初学者来说,难度并不是很大,而且通…

一份轴承振动数据集摘引 - XJTU-SY2019

1.原始引用 我第一次看到这个数据集是在知乎: XJTU-SY数据集轴承故障诊断 - 知乎XJTU-SY数据集包含了3种工况下的15个滚动轴承的全寿命周期振动信号,且明确标注了每个轴承的失效部位,相关论文如下:[1]雷亚国,韩天宇,王彪,李乃鹏…

DS:经典算法OJ题(1)

创作不易,友友们给个三连呗!! 本文为经典算法OJ题练习,大部分题型都有多种思路,每种思路的解法博主都试过了(去网站那里验证)是正确的,大家可以参考!! 一、移…

常用芯片学习——LM2596芯片

LM2596 3A降压型稳压器 使用说明 LM2596开关电压调节器是降压型电源管理单片集成电路,能够输出最大3A的驱动电流,同时具有很好的线性和负载调节特性。芯片按照输出版本可分为四种,分别是3.3V、5V、12V、ADJ(可调版本&#xff09…

一文读懂Python中的映射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。 获取成员: getattr class Foo:def __init__(self, name, age):se…

【command】使用nr简化npm run命令

参考文章 添加 alias nrnpm run通过alias启动命令可以帮助我们节省运行项目输入命令的时间 $ cd ~ $ vim .bash_profile $ source ~/.bashrc

应急响应-流量分析

在应急响应中,有时需要用到流量分析工具,。当需要看到内部流量的具体情况时,就需要我们对网络通信进行抓包,并对数据包进行过滤分析,最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…

isctf---crypto

夹里夹气 可以发现是摩斯密码 得到flag easy_rsa nc连接 rsa_d nc连接 计算d 七七的欧拉 task import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{*************} mbytes_to_long(flag)plibnum.generate_prime(1024) elibnum.generate_prime(51…

NPDP证书:让你的职业生涯飞升!

🌟没错!NPDP证书正在成为产品经理们的“新宠”!越来越多的同行们纷纷选择考取NPDP证书,为什么这么火爆?一起来探究下吧! 🚀NPDP认证:产品经理的国际通行证 📍NPDP&#x…

快速掌握PHP:用这个网站,让学习变得简单有趣!

介绍:PHP是一种广泛使用的开源服务器端脚本语言,特别适合Web开发。 PHP,全称为Hypertext Preprocessor,即超文本预处理器,是一种嵌入在HTML中的服务器端脚本语言。它主要用于管理动态内容和数据库交互,使得…

【GAMES101】Lecture 09 纹理贴图 点查询与范围查询 Mipmap

目录 纹理贴图 纹理放大-双线性插值 点采样纹理所带来的问题 Mipmap 各向异性过滤 纹理贴图 我们在之前的着色里面说过如何给物体上纹理,就是对于已经光栅化的屏幕点,就是每个像素的中心,去寻找对应纹理的映射位置的纹理颜色&#xff0…

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…

【Apache POI】百万级数据导出Excel,并含有折线等图表

需求概要 最近接到一个需求&#xff0c;概要来讲就是实现百万级数据导出Excel&#xff0c;并根据其中的数据项自动生成折线图等图表。经技术调研&#xff0c;针对内存、性能等要素&#xff0c;Apache POI此技术可完成此需求。 Apache POI是Apache软件基金会的开放源码函式库&am…

MySQL 覆盖索引

目录 一、什么是索引 二、索引的有哪些种类&#xff1f; 三、InnoDB的不同的索引组织结构是怎样的呢&#xff1f; 四、什么是覆盖索引 五、如何使用是覆盖索引&#xff1f; 六、如何确定数据库成功使用了覆盖索引呢 总结&#xff1a; 一、什么是索引 索引&#xff08;在 …

Redis高级特性

文章目录 1.4.1 Redis的缓存过期淘汰策略1.4.1.1 Redis内存满了怎么办1.4.1.2 过期策略1.4.1.3 缓存淘汰策略1.4.1.3.1 Redis 中LRU设计1.4.1.3.2 Redis 中LFU设计 1.4.2 持久化机制1.4.2.1 持久化流程1.4.2.2 RDB1.4.2.3 AOF1.4.2.3.1 AOF运行原理1.4.2.3.2 AOF文件重写原理 1…

PowerBI商业智能分析引入,带你了解什么是商务智能

一、商务智能工具 什么是Power BI &#xff1f;Power Bl是微软开发的一个软件&#xff0c;它是从获取数据、数据清洗、数据图表搭建、数据分析、共享发布为一体的软件&#xff0c;无论你的数据是简单的Excel电子表格&#xff0c;还是复杂庞大的数据库&#xff0c;Power Bl都可…

智慧文旅:提升旅游体验与推动经济发展的新动力

一、智慧文旅的定义与意义 智慧文旅&#xff0c;即智慧文化旅游&#xff0c;是一种以当地特色文化元素为核心驱动&#xff0c;利用现代科技手段实现旅游景区全面智慧升级的旅游模式。其意义在于为游客提供高效便捷的旅游信息化服务&#xff0c;提升旅游体验&#xff0c;同时推…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的&#xff0c;并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的源代码文件都是go …