二叉搜索树中的插入操作

news2024/11/16 0:03:30

1题目

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

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

示例 1:

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

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 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
输出:[4,2,7,1,3,5]

2链接

题目链接:701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

视频链接:原来这么简单? | LeetCode:701.二叉搜索树中的插入操作_哔哩哔哩_bilibili

3解题思路

题目中的提示:有多种有效的插入方式,所以按照二叉搜索树的性质我们选择最简单的方式:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。

 

递归三部曲:

  • 确定递归函数参数以及返回值

本函数使用返回值会比较简单。有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作

TreeNode* insertIntoBST(TreeNode* root, int val)
  • 确定终止条件

终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。

if (root == NULL) {
    TreeNode* node = new TreeNode(val);
    return node;
}

这里把添加的节点返回给上一层,就完成了父子节点的赋值操作了,即用上一层的结点接住新插入的结点

  • 确定单层递归的逻辑

因为是二叉搜索树,所以不需要遍历整棵树

if (root->val > val) root->left = insertIntoBST(root->left, val);
if (root->val < val) root->right = insertIntoBST(root->right, val);
return root;

遍历到某一层root时,发现为null,新建结点node储存val值,然后返回。递归外使用root->left或者root->right将其接住,这样就构建了本层root与新建node的关系。

4代码

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == nullptr) { //找到nullptr的时候证明就可以插入在此了
            TreeNode* node = new TreeNode(val);//把val值转化为一个新节点
            return node;//返回我们添加的节点,那么就必须有个东西接住它,才能建立链接
        }
        if (val < root->val) {
            root->left = insertIntoBST(root->left, val);//函数是有返回值的,遍历左子树那就用root->left接住
        }
        if (val > root->val) {
            root->right = insertIntoBST(root->right, val);
        }
        return root;//一层层递归,直到空结点与root->left或root->right建立链接返回
    }
};

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

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

相关文章

YOLOv3论文解读/总结

本章论文&#xff1a; YOLOv3论文&#xff08;YOLOv3: An Incremental Improvement&#xff09;&#xff08;原文&#xff0b;解读/总结&#xff0b;翻译&#xff09; 系列论文&#xff1a; YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 YOLOv2论文解读/总…

try(){}用法try-with-resources、try-catch-finally

属于Java7的新特性。 经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话&#xff0c;最后在finally块中显示的释放掉有可能被占用的资源。 但是如果资源类已经实现了AutoCloseable这个接口的话&#xff0c;可以在try()括号中可以写操作资源的语句(…

cocos 项目实践总结

文章目录 组件文档的理解&#xff1a;开发过程顺序问题&#xff1a;1、获取锚点坐标2、事件监听3、批量生成选词按钮4、Button可以自定义边界、边界颜色、及弧度一些问题记录1、button点击过后重新恢复页面渲染&#xff0c;button的状态偶发还是点击态而非正常态2、偶发事件绑定…

【自动驾驶基础入门】SLAM应该怎么学习?

1、SLAM是什么&#xff1f; SLAM是Simultaneous Localization and Mapping的缩写&#xff0c;即同时定位与地图构建。也称为自主机器人导航或者无人车等领域的基本任务之一。 简单来说&#xff0c;SLAM是指在未知环境中&#xff0c;通过移动机器人并利用其搭载的各种传感器数据…

Yolov5训练日记~如何用Yolov5训练识别自己想要的模型~

目录 一.数据集准备 二.标签设置 三.模型训练 四.模型测试 最近尝试了Yolov5训练识别人体&#xff0c;用的是自己尝试做的训练集。见识到Yolo的强大后&#xff0c;决定分享给大家。 一.数据集准备 数据集是从百度图片上下载的&#xff0c;我当然不可能一个一个下载&#xff…

还没用过这12款建筑设计软件?你OUT了

每个建筑设计软件都针对不同的需求。选择最好的一个取决于许多因素&#xff0c;例如成本、与其他程序的兼容性以及您愿意花在绘图过程上的时间。它还取决于您在设计过程中所处的位置——我们可能都开始在纸上画草图&#xff0c;然后转向建筑软件。我们甚至需要图形设计软件来说…

Haoop集群的搭建(小白教学)

搭建hadoop集群我们必须拥有自己的虚拟机&#xff0c;下列我会给大家奉上超详细的集群搭建以及我在搭建的时候碰到的问题以及对应解决办法&#xff0c;正所谓自己走过的错路是曲折的&#xff0c;也是防止大家做弯路&#xff0c;不仅浪费时间还心态爆炸&#xff0c;下面带走入ha…

蜘蛛池搭建需要多少域名?全面解析!

蜘蛛池是指为搜索引擎爬虫提供优质、可靠的页面&#xff0c;从而提高网站的收录和排名。在蜘蛛池搭建过程中&#xff0c;域名数量是一个非常重要的问题。那么&#xff0c;蜘蛛池搭建需要多少域名呢&#xff1f;本文将对这个问题进行全面解析。 首先&#xff0c;我们需要了解什么…

SQL教程

1、基础 演示数据库&#xff0c;下面是选自 “Websites” 表的数据&#xff1a; SELECT 语句用于从数据库中选取数据。 SELECT name,country FROM Websites;SELECT DISTINCT 语句用于返回唯一不同的值。 SELECT DISTINCT country FROM Websites;WHERE 子句用于提取那些满足…

二十三种设计模式第五篇--原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当直接创建…

Linux网络——Shell编程之循环

Linux网络——Shell编程之循环 一、循环1.循环与遍历2.循环的优势 二、for 循环语句1.for 语句的结构2.for语句应用示例 三、while 循环语句1.while 语句的结构2.while语句应用示例 四、until 循环五、跳出循环1.break2.continue3.exit 六、死循环 一、循环 定义&#xff1a;循…

2023年适合营销公司使用的十大「社交媒体管理」工具

在遍地都是数字营销公司的时代&#xff0c;对品牌来说&#xff0c;拥有强大的社交媒体影响力以保持竞争力从未如此重要。 而对于管理一个或多个品牌的数字营销公司来说&#xff0c;从内容创作到执行报告&#xff0c;使用正确的工具可以帮助你做到这一点。从规划、管理和跟踪社…

idb使用教程(一)

概述 iOS开发桥&#xff08;idb&#xff09;是一个多功能的工具&#xff0c;用于自动化iOS模拟器和设备。它在一个一致的、对人友好的界面中暴露了很多分布在苹果工具中的功能。 安装 idb由两个部分组成&#xff0c;每个部分都需要单独安装。 idb伴侣 每个目标&#xff08…

《花雕学AI》ChatMind:与AI对话,轻松梳理思路并创建思维导图

引言&#xff1a; 思维导图是一种有效的思维工具&#xff0c;可以帮助用户整理和表达自己的思路&#xff0c;提高学习和工作的效率和质量。然而&#xff0c;传统的思维导图工具往往需要用户花费大量的时间和精力&#xff0c;学习和操作复杂的界面和功能&#xff0c;而且很难根据…

医院智能导诊系统,医院导航解决方案

随着现代医院规模不断扩大&#xff0c;功能区域越来越细化&#xff0c;面对复杂的楼宇结构&#xff0c;集中的就诊人流&#xff0c;患者在就诊中经常会面临找不到目的地的困境&#xff0c;就诊体验变差。针对这个问题&#xff0c;一些面积和规模都比较大的医院&#xff0c;已经…

html实现经典打方块小游戏

文章目录 1.设计来源1.1 主界面1.2 游戏界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130581985 html实现经典打方块小游戏源码 html实现经典打方块…

自主可控不走捷径,中国长城做难且正确的事

2020-2022年是中国信创产业的重要推广期&#xff0c;在国家战略的支持下&#xff0c;自主可控领域诸多相关企业均获得绝佳发展良机。 但信创产业“完成替代”不是终点&#xff0c;“实现领先”方是目标。如今势已启、路尚远&#xff0c;前景广阔的市场并不意味着自主可控相关企…

运营商三要素验证原理,这篇文章就够了!

引言 运营商三要素验证 API 是一种基于手机号码、身份证号码和姓名等三种信息的验证服务&#xff0c;主要用于验证用户身份信息的真实性和一致性&#xff0c;以及查询手机号码所属的运营商信息。 运营商三要素 API 的验证原理 1. 身份验证的原理 身份信息验证是运营商三要素…

入门级的家用洗地机怎么样?入门级洗地机推荐

洗地机的功能有很多&#xff0c;比如除菌、洗地机清洁地面的确是一把好手。但是&#xff01;清洁完之后还要手动清洗洗地机&#xff0c;是一件麻烦事啊&#xff01;现在市面上大部分洗地机都有自清洁这个功能&#xff0c;但是很多洗地机的自清洁并不算真正的自清洁&#xff0c;…

从月薪3000到月薪20000,自动化测试应该这样学...

绝大多数测试工程师都是从功能测试做起的&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要…