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

server/2025/1/8 23:43:01/

题目:

给定二叉搜索树(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]

提示:

  • 树中的节点数将在 [0, 104]的范围内。
  • -108 <= Node.val <= 108
  • 所有值 Node.val 是 独一无二 的。
  • -108 <= val <= 108
  • 保证 val 在原始BST中不存在。

思路:

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

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

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

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

  1. 递归法

递归三部曲:

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

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

可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的。

有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作。

递归函数的返回类型为节点类型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将其接住。

  1. 迭代法

在迭代法遍历的过程中,需要记录一下当前遍历的节点的父节点,这样才能做插入节点的操作。

因为迭代的循环退出后,当前节点cur为NULL,且cur的位置就是要插入元素的位置,所以要记录该节点的父节点parent进行赋值。


代码:

  1. 递归法
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);else if(root->val < val) root->right = insertIntoBST(root->right, val);return root;}
};
  1. 迭代法
class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == NULL){TreeNode* node = new TreeNode(val);return node;}TreeNode* cur = root;   //  当前节点TreeNode* parent = root;    // 这个很重要,需要记录上一个节点,否则无法赋值新节点while(cur != NULL){ //  退出循环后,此时的cur为空,且cur的位置就是插入元素的位置,所以根据cur的父节点parent赋值parent = cur;if(cur->val > val) cur = cur->left;else if(cur->val < val) cur = cur->right;}//  根据parent赋值TreeNode* node = new TreeNode(val);if(parent->val > val) parent->left = node;else parent->right = node;return root;}
};

总结:

首先在二叉搜索树中的插入操作,不用恐惧其重构搜索树,其实根本不用重构。

然后在递归中,重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。

最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。


参考:

代码随想录


http://www.ppmy.cn/server/156911.html

相关文章

中电金信携手华为发布“全链路实时营销解决方案”,重塑金融营销数智新生态

在数智化转型成为驱动经济社会高质量发展的新引擎背景下&#xff0c;“数智方案”栏目聚焦金融等国计民生重点行业场景&#xff0c;依托中电金信“源启筑基咨询引领应用重构”的产品及服务体系&#xff0c;输出市场洞察和行业解决方案、应用案例&#xff0c;旨在全面推动行业IT…

气膜滑雪馆:科技创新引领四季滑雪,推动冰雪运动普及—轻空间

随着冬季的到来&#xff0c;冰雪运动迎来了蓬勃发展的时机。然而&#xff0c;冰雪运动一直受到季节和天气的限制&#xff0c;如何让更多人能够跨越这些障碍&#xff0c;全年享受滑雪的乐趣&#xff0c;成为推动冰雪产业普及的关键。自12月以来&#xff0c;“气膜滑雪馆”成为了…

Json字符串解析失败

通过第三方服务&#xff0c;拿到响应体的data对象&#xff08;拿到的时候对象是有值的&#xff09; 通过JSON.parseObject方法&#xff0c;拿到的对象&#xff0c;值为null 通过查看对应的json字符串&#xff0c;发现命名不一样... JSONField SeriealizedName注解是用来解析j…

Docker学习记录:安装nginx

1.基本操作 先查看一下&#xff0c;目前开放了哪些 ktkt-SYS-4028GR-TR2:~$ sudo nmap -sT localhost Starting Nmap 7.80 ( https://nmap.org ) at 2025-01-06 11:02 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.00017s latency). Not shown: 998 closed…

git 常用命令和本地合并解决冲突

目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近&#xff0c;使用mac电脑&#xff0c;无法直接使用小乌龟进行可视化操作&#xff0c;现在记录一些常用命令。 拉取&#xff1a; git clone <git url> 仅拉起某个单独分支&#xff1a; git clo…

基于R语言的DICE模型

DICE型是运用最广泛的综合模型之一。DICE和RICE模型虽然代码量不多&#xff0c;但涉及经济学与气候变化&#xff0c;原理较为复杂。 一&#xff1a;DICE模型的原理与推导 1.经济学 2.气候变化问题 3.DICE模型的经济学部分 4.DICE模型的气候相关部分 5.DICE模型的目标函数…

JVM生产环境常用参数配置及调优建议

一、生产常用参数配置 JAVA_OPTS"-server -Xms3000m -Xmx3000m -Xmn1500m -XX:UseG1GC -XX:ConcGCThreads8 -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize256m -XX:-UseGCOverheadLimit -XX:UseCompressedOops -XX:HeapDumpOnOu…

C++二十三种设计模式之原型模式

C二十三种设计模式之原型模式 一、组成二、特点三、目的四、缺点五、示例代码 一、组成 抽象原型类&#xff1a;声明克隆接口。 具体原型类&#xff1a;实现克隆接口。 二、特点 1、通过具体原型类克隆的对象只是部分属性值不同。 2、克隆函数内部可用拷贝构造函数赋值。 三…