二叉树|701.二叉搜索树中的插入操作

力扣题目链接

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        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;
    }
};

不要被题目迷惑了,这题真的是个简单题啊!
哪里有空位插入哪里就好了!

代码随想录 (programmercarl.com)

思路

这道题目其实是一道简单题目,但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人,瞬间感觉题目复杂了很多。

其实可以不考虑题目中提示所说的改变树的结构的插入方式。

如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。

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

例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,需要调整二叉树的结构么? 并不需要。

只要遍历二叉搜索树,找到空节点 插入元素就可以了,那么这道题其实就简单了。

接下来就是遍历二叉搜索树的过程了。

#递归

递归三部曲:

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

参数就是根节点指针,以及要插入元素,这里递归函数要不要有返回值呢?

可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,下面也会给出其具体实现代码。

有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作。(下面会进一步解释)

递归函数的返回类型为节点类型TreeNode * 。

代码如下:

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->left或者root->right将其接住

整体代码如下:

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        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;
    }
};

可以看出代码并不复杂。

刚刚说了递归函数不用返回值也可以,找到插入的节点位置,直接让其父节点指向插入节点,结束递归,也是可以的。

自己的思路:

嗯嗯,new这里出错了,语法不是很熟悉。

然后思路没问题,一下子就写出来了~ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

v-bind=“$attrs“ v-on=“$listeners“的理解及用法

前言&#xff1a; vue通信手段有很多种&#xff0c;props/emit、vuex、event bus、provide/inject 等&#xff0c;还有 a t t r s 和 attrs和 attrs和listeners&#xff0c;主要用于隔代传值 1、$attrs 官方解释&#xff1a;包含了父作用域中不作为 prop 被识别 (且获取) 的特…

敏捷开发——Axios

一创建一个项目&#xff0c;首先要解决的是跨域问题 解决跨域问题&#xff1a; 1. 服务端解决 2. 设置代理 配置完 config 文件一定要重启&#xff0c;否则不生效 1.设置代理服务器 vue.config.js 1)用"/api" 代替目标地址"https://www.pku.edu.cn" 2…

linux下使用迅雷的完美办法(网络版免费),其他下载工具

迅雷有自家服务器的支持&#xff0c;因此&#xff0c;其他下载器&#xff0c;可能难以匹敌 &#xff1f; linux下使用迅雷的完美办法&#xff08;免费&#xff09; https://blog.csdn.net/lqrensn/article/details/8853949 网络版 Linux下安装并使用迅雷 https://www.lxlin…

独立站攻略|如何使用SEO代理优化网站排名?

每天&#xff0c;互联网上都会生成和共享大量信息&#xff0c;这使得预测哪个关键字或主题将成为趋势变得很有挑战性&#xff0c;因此人们可以预测和优化他们的搜索引擎排名。但使用“SEO 代理”&#xff0c;就会使得SEO优化更加有效且精准。 一、什么是SEO&#xff1f; 简而言…

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战&#xff0c;还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

2024河北采煤机械展览会|河北煤矿展会|石家庄煤业展会

2024中国&#xff08;石家庄&#xff09;国际煤炭装备及矿山设备博览会 时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定 随着全球能源结构的转型与升级&#xff0c;煤炭行业正面临前所未有的发展机遇与挑战。作为煤炭产业的重要组成部分&#xff0…

开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)

一、前言 预训练模型提供的是通用能力&#xff0c;对于某些特定领域的问题可能不够擅长&#xff0c;通过微调可以让模型更适应这些特定领域的需求&#xff0c;让它更擅长解决具体的问题。 本篇是开源模型应用落地-qwen-7b-chat-LoRA微调&#xff08;一&#xff09;进阶篇&#…

知名策略师上调微软目标价,微软后期走势将怎样?

KlipC报道&#xff1a;美国投行知名策略师Dan Ives将微软目标价从475美元上调至500美元&#xff0c;该新目标意味着较周一收盘价有18%的上涨空间。 值得一提的是Copilot是微软在Windows 11中加入的AI助手&#xff0c;该AI助手可以帮助用户完成各种任务。随着微软人工智能助理工…

QT中的 容器(container)简介

Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并且更易于使…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准&#xff0c;黑龙江日报报业集团主管主办&#xff0c;面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者&#xff0c;开展学术交流与研讨&#xff0c;汲取当今业界新鲜的…

无线开关量收发模块如何在远距离情况下监测工厂设备运行?

PLC无线通讯一般有以下几个应用场景&#xff1a; 【应用一】开关量信号1点对多点远距离无线通讯 支持点对点及1点对多点&#xff0c;多路开关量/数字量信号远距离无线传输通讯 【应用二】开关量信号多点对1点之间远距离无线通讯 PLC、泵阀、二次仪表、继电器等I/O开关量信号…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

Ribbon简介

目录 一 、概念介绍 1、Ribbon是什么 2、认识负载均衡 2.1 服务器端的负载均衡 2.2 客户端的负载均衡 3、Ribbon工作原理 4、Ribbon的主要组件 IClientConfig ServerList ServerListFilter IRule Iping ILoadBalancer ServerListUpdater 5、Ribbon支持…

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例&#xff0c;演示了如何使用CONCAT函数&#xff1a; -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…

拥抱绿色革命!揭秘CAE仿真技术在风电能源领域的应用

众所周知&#xff0c;风能是清洁能源的代表&#xff0c;而风电更是其核心。伴随着全球电力需求的日益增长以及环保节能意识的逐渐加强&#xff0c;加强生态文明建设&#xff0c;推进绿色低碳发展&#xff0c;已成为当今社会的共识。政府工作报告提到&#xff0c;过去一年可再生…

MySQL高级SQL2

一、表连接 二、视图 三、null值和空值区别 四、存储过程 五、函数 六、字符串函数 七、日期时间函数

Java Swing游戏开发学习19

内容来自RyiSnow视频讲解 这一节讲的是**Entity ArrayList(Render Order Revised)**实体数组列表&#xff08;渲染顺序修改&#xff09;。 前言 由于NPC和player的实体碰撞区域比他们本身的大小要小&#xff0c;所以会造成一个bug&#xff0c;当前的绘制顺序是&#xff0c;NP…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…