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

文章目录

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

题目

标题和出处

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

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

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

相关文章

当身体发出这八个信号时注意了!这有可能就是植物神经紊乱!

植物神经系统是人体自主神经系统的一部分,它调节内脏器官的活动并维持人体内环境的平衡。植物神经紊乱是指植物神经系统失去平衡而引起的一系列身体反应。这些反应可能是不规律、异常或者不适当的。 那么,植物神经紊乱有哪些常见的信号呢?下…

老龄化对投资意味着什么?

1月15日,国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告&#xff0…

Java面试题(11)

59.说一说springMVC的运行流程 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获; 2. DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,…

敲黑板啦!CSGO游戏搬砖项目操作注意事项

CSGO游戏搬砖项目怎么赚钱的,利润在哪? 1.两个平台之间币种不一样,就存在一个汇率差,两平台装备价格也不一样,汇率差-价格差利润。 CSGO游戏搬砖项目具体有哪些操作步骤? 1、准备一台电脑,配置…

数字图像处理(实践篇)二十八 使用OpenCV Python中的K-means对图像进行颜色量化处理

目录 1 颜色量化 2 实践 在某些时候,不可避免的某些设备只能生成有限数量的颜色。因此需要执行颜色量化。选择使用cv2.kmeans()函数对颜色量化应用k-means聚类。 1 颜色量化 使用K-means聚类在图像中实现颜色量化的步骤如下: ① 导入依赖库

FTP文件传输协议

一、存储类型 存储类型分为三种 直连式存储:Direct-Attached Storage,简称DAS 存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 网络附加存储:Networ…

【leetcode】232. 用栈实现队列

用栈实现队列 题目链接 typedef int valuetype; typedef struct {valuetype* arr;int top;int capacity; } Stack;void Init(Stack* stack);void Push(Stack* stack, valuetype value); void Pop(Stack* stack);valuetype Top(Stack* stack); int Size(Stack* stack); bool…

C/C++ - 函数进阶(C++)

目录 默认参数 函数重载 内联函数 函数模板 递归函数 回调函数 默认参数 定义 默认参数是在函数声明或定义中指定的具有默认值的函数参数。默认参数允许在调用函数时可以省略对应的参数,使用默认值进行替代。 使用 默认参数可以用于全局函数和成员函数。默认参…

Docker安装RcoketMQ

1、Docker安装RcoketMQ-4.9.4 在同级文件夹创建目录config,并在里面创建文件broker.conf,文件内容如下: brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDis…

子类构造器的特点

子类的全部构造器,都会先调用父类的构造器,再执行自己 class F{public F(){System.out.println("父类的无参数构造器");} }class Z extends F{public Z(){System.out.println("子类的无参数构造器");} }public class Test {public s…

Python第三方扩展库Matplotlib

Python第三方扩展库Matplotlib Matplotlib 是第三方库,不是Python安装程序自带的库,需要额外安装,它是Python的一个综合性的绘图库,提供了大量的绘图函数用于创建静态、动态、交互式的图形和数据可视化,可以帮助用户创…

【深度学习:目标检测】深度学习中目标检测模型、用例和示例

【深度学习:目标检测】深度学习中目标检测模型、用例和示例 什么是物体检测?物体检测与图像分类物体检测与图像分割 计算机视觉中的目标检测物体检测的优点物体检测的缺点深度学习和目标检测人员检测 物体检测如何工作?一阶段与两阶段深度学习…