Q701二叉搜索树的插入操作-递归法-刷leetcode日记

news2025/2/27 5:29:04

声明:问题描述来源leetcode

一、问题描述:

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

难度中等400

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

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

示例 1:

img

输入: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中不存在。

二、题解:

  • 思路:

还是中序遍历,就是在写好中序遍历的基础上不断地进行修修补补.

xin麒的思路一开始是这样的

首先回忆下中序遍历的样子:

  • 过程1
public class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        search(root);
        return root;
    }
    private void search(TreeNode root) {
        if (root.left != null) search(root.left);
        if (root.right != null) search(root.right);
    }
}

一开始xin麒觉得只要搜索到刚刚好大于val的时候就将该节点返回,然后就对改节点进行处理不就好了吗?怎么处理?看下面的:

  • 过程2
public class Solution {
    TreeNode goal = new TreeNode(Integer.MIN_VALUE);
    int val;
    
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) return new TreeNode(val);
        search(root);
        if (goal.val > val){
            goal.left = new TreeNode(val);
        }else {
            goal.right = new TreeNode(val);
        }
        return root;
    }
    private void search(TreeNode root) {
        if (goal.val > val) return;
        if (root.left != null) search(root.left);
        goal = root;
        if (root.right != null) search(root.right);
    }
}

如果root为空,那么直接返回一个以val为值的树;

①我们要找出一个刚刚好大于val的树节点,那么就要在中间让goal进行赋值。然后当搜索结束后我们就可以将得到的goal做处理。对于返回的节点goal还要处理下,因为可能题目锁给的整棵树的所有值没有比val更大的值。

对于返回来的结果,如果goal.val小于val那么说明整棵树就没有比val更大的节点了。

于是将新节点插入goal的右子树,反正则左子树。

②而为什么初始化goal时是TreeNode goal = new TreeNode(Integer.MIN_VALUE);这样子呢?

因为Integer.MIN_VALUE < -10^8,保证一开始能够进得去递归函数search里面。

  • 过程3

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

时的结果应该是下面这样:

在这里插入图片描述

但是依据之前的代码的结果是:在这里插入图片描述

为什么呢,因为在search的递归遍历到节点30时,本来是返回30这个节点的,但是因为走完左子树不加控制,导致返回的值不是真正想要的,也就是在if (root.left != null) search(root.left);后没加防控,应该再判断一下goal.val才对,于是应该修改search的方法为:

private void search(TreeNode root) {
    if (goal.val > val) return;
    if (root.left != null) search(root.left);
    if (goal.val > val) return;
    goal = root;
    if (root.right != null) search(root.right);
}
  • 过程4:

xin麒之前所说对返回的goal进行处理是吧,其实没怎么简单就可以处理好,因为如果出现这个情况呢:
(img-YrDlbRmy-1668529827646)(Q701_4.png)]

那么返回的goal其实是节点8,那么这样子不行呀,应该要返回在中序遍历的上一个节点4才对呀!

于是就需要有一个前节点来记录了:

最终结果:

class Solution {
    TreeNode goal = new TreeNode(Integer.MIN_VALUE);
    TreeNode before;
    int val;
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null) return new TreeNode(val);
        this.val = val;
        search(root);

        if (goal.val > val){
            if (goal.left == null){
                goal.left = new TreeNode(val);
            }else {
                before.right = new TreeNode(val);
            }
        }else {
            goal.right = new TreeNode(val);
        }

        return root;
    }

    private void search(TreeNode root) {
        if (goal.val > val) return;
        if (root.left != null) search(root.left);
        if (goal.val > val) return;
        before = goal;
        goal = root;
        if (root.right != null) search(root.right);
    }
}

这里的before是记录旧数据的

怎么知道获取上面例子的节点值为8的是不对的,通过对goal来判断,判断如果左节点不为null不就可以了吗?左节点不为null说明该goal不是叶子节点。

end

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

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

相关文章

如何支持微软邮箱OAuth2.0认证

近期收到部分使用微软邮箱的客户反映&#xff0c;在EDI系统中无法连接到他们的企业邮箱中&#xff0c;连接过程中报错&#xff1a; IMAP protocol error. 1 NO LOGIN failed…&#xff0c;经确认是微软停用了邮箱的基本验证功能&#xff0c;客户端必须使用OAuth2.0认证&#xf…

如何验证 Kubernetes YAML 文件

原文出自&#xff1a;Armo’s blog 原文作者&#xff1a;Bezalel Brandwinen,&#xff0c;Team Lead at Armo Ltd Kubernetes 在我们现在如何管理容器化应用程序方面占据了中心位置。因此&#xff0c;存在许多定义我们的 的协议&#xff0c;包括 、JSON、INI 等结构。 这使得我…

自动化测试中对数据恢复的思考与实际业务改造实践

在接口自动化测试过程中&#xff0c;构造测试数据是必不可少的一个环节&#xff0c;但如何恢复测试数据也同样值得关注。业内常见的做法有&#xff1a; 1、不恢复&#xff1a;如果是没什么影响的数据&#xff0c;不恢复也无所谓&#xff0c;缺点就是会造成大量数据冗余&#x…

2022 年 10 月区块链操作系统的开发回顾

查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在寻找区块链操作系统组件的最新进展&#xff1f;你找对地方了&#xff01;正如在我们的路线图文章中所描述的那样&#xff0c;我们一直在朝着定期且频繁的更新方向发展着&#xff0c;以便让我们的社区能够及时的了解…

【前端】Ajax

目录 一、服务器对外提供了哪些资源 二、了解Ajax 2.1什么是Ajax 2.2Ajax作用 三、jQuery中的Ajax 3.1$.get()函数的语法 3.2$.post()函数的语法 3.3$.ajax()函数的语法 四、接口 4.1接口的概念 4.2接口测试工具 4.3接口文档 一、服务器对外提供了哪些资源 如果要在…

1.1小程序内置tabbar和自定义tabbar区别

文章目录内置tabbar自定义 tabbar创建文件夹 custom-tab-bar发现小程序自定义tabBar切换颜色总是比点击慢一步switchtab报错“switchTab:fail page “pages/home/pages/message/message” is not found”直接在微信开发文档内搜索&#xff0c;出现的是自定义 tabbar &#xff0…

用HTML+CSS做一个简单好看的校园社团网页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园班级网页设计 | 我的班级网页 | 我的学校 | 校园社团 | 校园运动会 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 …

C# 零基础搭建一个简单的Asp.Net Core WebAip

下面介绍的vs2022 基于.NET 6 搭建的一个简单的Asp.Net Core WebAip 一、创建aps.net core Web Aip 1、创建一个新的Asp.Net Core WebApi 项目 启动vs2022&#xff0c;在开始页面选择“创建新项目(N)”。 选择从C#的asp.net core WbeApi 作为一个初始的WebApi模板。 点击下…

C++初阶 List的介绍和使用

作者&#xff1a;小萌新 专栏&#xff1a;初阶C 作者简介&#xff1a;大二学生 希望能和大家一起进步 博客简介&#xff1a;本篇博客会简单介绍List和它的用法 List的介绍和使用List介绍List的使用方式List的定义方式List的插入与删除push_front pop_frontpush_back pop_backi…

虚拟机磁盘扩容(纯命令行)

背景&#xff1a;磁盘使用率达到100%&#xff0c;无大数据文件可删除&#xff0c;需要进行磁盘扩容 步骤&#xff1a; 1.虚拟机调高分配给磁盘的大小 2.启动虚拟机&#xff0c;查看磁盘是否扩容 fdisk -l 3.扩容磁盘分区 fdisk /dev/sda 先输入p查看当前情况 输入d&#xf…

Flash、eeprom、rom、ram

存储器 ramrom rom: 不能编程prom: 可以写入一次eprom: 多次擦写, 需要在紫外线照一下eeprom: 任意修改 狭义EEPROM:广义EEPROM: flash nor flash: 字节读, 块擦除nand flash: 页读取, 块擦除 ROM&RAM EEPROM 可随机访问/修改任意字节, 可向每个bit写入0/1, 掉电不丢…

【附源码】计算机毕业设计JAVA传统文化知识竞赛系统

【附源码】计算机毕业设计JAVA传统文化知识竞赛系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

推荐一本计算机领域可以发的2区计算机智能医疗类SCI

本期小编给大家推荐的是我处新增的一本TECH SCIENCE PRESS旗下2区智能医疗类SCI. 这本期刊是一本经同行评审的开放获取期刊&#xff0c;出版计算机网络、人工智能、大数据、软件工程、多媒体、网络安全、物联网、材料基因组、集成材料科学以及数据分析、建模、现代功能和多功…

同花顺_代码解析_五彩K线

本文通过对同花顺自带的五彩K线进行解析&#xff0c;用以了解同花顺相关策略设计的思想。 目录 早晨之星 黄昏之星 十字星 长十字星 垂死丁字 射击之星 穿头破脚 红三兵 三只乌鸦 光头阳线 红绿灯 早晨之星 行号 1 a1 -> K线实体长度是开盘价的0.5%以下&…

MAX25————用vray还原模型在Substance Painter的光照以及材质效果

现在很多小伙伴喜欢在Substance Painter&#xff08;俗称SP&#xff09;里面做贴图。但是经常很苦恼&#xff0c;sp里做出的效果&#xff0c;导出来&#xff0c;放到unity或者max里面再渲染&#xff0c;光照跟材质效果就都变了。其实很简单&#xff0c;做到以下几点。就可以还原…

我的有趣的英语学习经历

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 我是一个社牛&#xff0c;大大咧咧&#xff0c;与人交往&#xff0c;不会瞻前顾后。 上半年&#xff0c;大四即将毕业&#xff0c;我闲来无事&#xff0c;突然脑袋发热&#xff0c;想找原版《经济学人》翻翻。于…

第十一届蓝桥杯国赛C++B组题解(A - J)

第十一届蓝桥杯国赛CB组 美丽的2 题目地址&#xff1a;https://www.lanqiao.cn/problems/1018/learning/ 难度&#xff1a;简单 知识点&#xff1a; 模拟枚举 【题目描述】 ​ 1−20201-20201−2020 中有多少个数中含有数字2 【解题思路】 范围很小&#xff0c;直接暴力判断…

c盘垃圾太多怎么清理?c盘垃圾太多需要重装系统嘛?

一台电脑为了方便大家平时使用过程中存储各种文件&#xff0c;会为用户们规划多个不同的磁盘&#xff0c;当然这些磁盘大家也可以使用一些工具来自己设置&#xff0c;其中最为重要的就是C盘了&#xff0c;作为系统磁盘C盘里面会存储大量的文件&#xff0c;这些文件并不是系统必…

思必驰周强:AI 和传统信号技术在实时音频通话中的应用

如何用 AI 解决声音传输&处理中的三大问题&#xff1f;三大问题又是哪三大问题&#xff1f; 在「RTE2022 实时互联网大会」中&#xff0c;思必驰研发总监 周强以《AI 和传统信号技术在实时音频通话中的应用》为题进行了主题演讲。 本文内容基于演讲内容进行整理&#xff0…

MySql表的基本增删改查详解

目录创建表create表中--插入数据--“增”单行&#xff0c;全列插入多行插入插入重复则-更新插入重复则-替换插入查询结果表中--检索数据--“查”全列查询指定列查询查询字段为表达式给查询结果指定别名WHERE 限定条件比较运算符逻辑运算符where使用实例模糊匹配ORDER BY排序筛选…