3月1号代码随想录二叉搜索树中的插入操作

news/发布时间2024/9/20 8:40:53

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

给定二叉搜索树(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中不存在。

思路

写了半天思路没有打开,以为需要考虑加在已连接的两个节点中间的情况,但是实际上任何时候都可以找到一个没有左子树或者右子树的节点直接插入,不需要多余的操作,这样思路就简单多了。

    class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) {return new TreeNode(val);}Stack<TreeNode> stack=new Stack<>();TreeNode pos=root;while(pos!=null){if (val < pos.val) {if(pos.left==null){pos.left=new TreeNode(val);break;}else {pos=pos.left;}}else {if (pos.right == null) {pos.right=new TreeNode(val);break;}else{pos=pos.right;}}}return root;}}

这里有一个需要注意的点就是当树为空时需要将新节点当作根节点返回。

450.删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

提示:

  • 节点数的范围 [0, 104].
  • -105 <= Node.val <= 105
  • 节点值唯一
  • root 是合法的二叉搜索树
  • -105 <= key <= 105

进阶: 要求算法时间复杂度为 O(h),h 为树的高度。

思路

删除一个节点分为两种情况:

1、删除的节点为叶子节点,此时只要简单删除该节点即可,将父节点的对应子节点删除。

2、若删除的节点有子树,也分为两种情况:

        a、删除节点只有一个儿子,则将该子节点代替删除节点的位置。

        b、删除节点有两个子节点。此时需要将其中一个节点上移,另一个节点作为该节点的子节点,但是若上移节点有两个子树,此时需要将其中一个子树移动到另一个节点所在子树中。

我们假设将右节点b上移,那么左节点a就会变成b的左子节点,此时b的原左子树需要移动到a所在子树,根据二叉搜索树的特点,b的原左子树一定大于a所在子树中所有值,所以将其移动到a所在子树的最右节点的右子树。

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if(root==null){return null;}if(key>root.val){root.right=deleteNode(root.right,key);}else if(key<root.val){root.left=deleteNode(root.left,key);}else{if(root.left==null){root=root.right;}else if(root.right==null){root=root.left;}else{TreeNode tmp=root.left;while(tmp.right!=null){tmp=tmp.right;}tmp.right=root.right.left;root.right.left=root.left;root=root.right;}}return root;}
}

还得是递归,迭代真拎不清。

迭代法

其实迭代法的思路也很简单,设置一个父节点记录一下即可,其他思路一样

    class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur=root,par=null;while(cur!=null&&cur.val!=key){par=cur;if (cur.val > key) {cur=cur.left;}else {cur=cur.right;}}if (cur == null) {return root;}if (cur.left == null) {cur=cur.right;}else if(cur.right==null){cur=cur.left;}else {TreeNode tmp=cur.left;while(tmp.right!=null){tmp=tmp.right;}tmp.right=cur.right.left;cur.right.left=cur.left;cur=cur.right;}if (par == null) {return cur;}else{if(par.left!=null&&par.left.val==key){par.left=cur;}else {par.right=cur;}}return root;}}

总结

今天的题目先把思路写出来再去写的代码,感觉流畅了很多。

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

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

相关文章

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

Redis——服务器

Redis服务器负责与多个客户端建立网络连接&#xff0c;处理客户端发送的命令请求&#xff0c;在数据库中保存客户端执行命令所产生的数据&#xff0c;并通过资源管理来维持服务器自身的运行。 一. 命令请求的执行过程 一个命令请求从发送到获得回复过程中&#xff0c;客户端和服…

【精品】集合list去重

示例一&#xff1a;对于简单类型&#xff0c;比如String public static void main(String[] args) {List<String> list new ArrayList< >();list.add("aaa");list.add("bbb");list.add("bbb");list.add("ccc");list.add(…

数据之光:探索数据库技术的演进之路

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

09-Java组合模式 ( Composite Pattern )

Java组合模式 摘要实现范例 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象 组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次 组合模式创建了一个包含自己对象组…

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

SpringBoot实现短链跳转

目录 1.背景介绍 2.短链跳转的意义 3.SpringBoot中的代码实现 1.建议短链-长链的数据库表&#xff1a;t_url_map: 2.映射实体 3.Dao层实现 4.Service层实现 5.Controller层实现 3.结果测试 4.问题 1.背景介绍 短链跳转是一种通过将长链接转换为短链接的方式&…

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…

OceanMind海睿思-知信版本升级:多轮对话+LLM加速!

OceanMind海睿思-知信 产品能力全新升级&#xff1a; ❖ 知识库增加多轮对话能力&#xff0c;给用户带来更“人性化”的问答体验 ❖ 自研大模型推理加速机制&#xff0c;为大模型回答提速&#xff0c;减少用户等待时间消耗 1 多轮对话升级 基于“RAG大模型”框架的知识库问…

ChatGPT科研绘图丨散点图、柱状图、小提琴图、箱型图、雷达图、玫瑰图、气泡图、森林图、三元图、三维图等各类科研图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Rocky Linux 运维工具 vim

一、vim的简介 vi​m是一种文本编辑器。它提供了丰富的编辑功能&#xff0c;包括插入、删除、替换文本、搜索和查找等。使用键盘命令和模式切换&#xff0c;以实现高效的文本编辑操作。 二、vim的参数说明 序号视图命令描述1命令视图i在当前光标位置进入‘INSERT视图’2命令视…

2024年四川媒体新闻发布渠道,媒体邀约资源表

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 四川有哪些媒体新闻发布渠道&#xff0c;媒体邀约资源表&#xff1f; 2024年四川媒体新闻发布渠道&#xff0c;媒体邀约资源表 四川本地媒体&#xff1a;如四川日报、华西都市报、成都商…

浅谈MySQL的B树索引与索引优化

MySQL的MyISAM、InnoDB引擎默认均使用B树索引&#xff08;查询时都显示为“BTREE”&#xff09;&#xff0c;本文讨论两个问题&#xff1a; 为什么MySQL等主流数据库选择B树的索引结构&#xff1f;如何基于索引结构&#xff0c;理解常见的MySQL索引优化思路&#xff1f; 为什…

c语言经典测试题8

在c语言经典测试题6的第一题&#xff0c;大家是否想过可不可以将递归参数改为s呢&#xff1f;或许有的人已经试过了&#xff0c;但是发现好像不会有结果&#xff0c;其实是因为s为后置&#xff0c;先试用后加1&#xff0c;然而我们这个是在s出了函数之后才会运行加1操作&#x…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

「MySQL」增删查改

在操作数据库中的表时&#xff0c;需要先使用该数据库&#xff1a; use database;新增 创建表 先用 use 指定一个数据库,然后使用 create 新增一个表 比如建立一个学生表 mysql> use goods; mysql> create table student(-> name varchar(4),-> age int,-> …

附加Numpy数组

参考&#xff1a;Append Numpy Array 引言 在数据科学和机器学习领域&#xff0c;处理大规模数据集是一项重要且常见的任务。为了高效地处理数据&#xff0c;numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作&#xff0c;即如何附加&#xff08;append&a…

【python基础学习05课_for循环以及双重for循环】

FOR循环 一、认识循环-while 1、循环条件不能超出列表长度 当i 1&#xff0c;while i < len(lst1) 时&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老师&#xff0c; 继续1, i 4, 4不小于 len(lst1)&#xff0c;打破循环。 2、循环条件超出列表长度报错…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…
推荐文章