二叉搜索树大冒险:寻找-插入-删除

OK,看我们题目就可知道啦,今天要分享学习的一种数据结构就是二叉搜索树。

内容题目也说了三个大概的,分别是寻找、插入、删除。

讲这个之前呢,那么就先讲讲这个二叉搜索树是何方神圣呢?

二叉搜索树:

又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树:

若它的左子树不为空,则左子树上的所有节点的值都小于根节点的值。

若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值。

它的左右子树也分别为二叉搜索树

示例如下:

OK,讲完了这个概念,那么接下来这个操作内容吧。

首先创建这个节点先

public class SearchTree {class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val){this.val=val;}}public TreeNode root=null;
}

以及把这个节点初始一个变量root,置为null。

接下来,就写这个简单的方法——查找

查找

public TreeNode search(int key){TreeNode cur=root;while(cur!=null){if(cur.val<key){cur = cur.right;}else if(cur.val>key){cur=cur.left;}else{return cur;}}return null;}

思路:

让一个cur的节点帮我去走,因为root的左边比root小,右边比root大,所以当cur.val小于key时,说明key大往右走,否则往左走,都不是,即找到了,就可以返回当前节点的值了。

插入

先上代码

public void insert(int val){TreeNode node=new TreeNode(val);if(root==null){root=node;return;}TreeNode cur=root;TreeNode parent=null;while(cur!=null){if(cur.val>val){parent=cur;cur=cur.left;}else if(cur.val<val){parent=cur;cur=cur.right;}else{return;}}if(parent.val>val){parent.left=node;}else{parent.right=node;}}

思路:

先定义好一个Node节点,保存要插入的信息,然后再定义一个parent节点来保存上一个节点的信息,为什么呢?

因为这个总体思路就是要插入的节点的值比这个当前root节点的值进行比大小,大于root就往右走,小于往左走。

接着,再定义一个cur的节点,让它去走,当cur往左还是往右走时,parent都要走到当前cur的位置

当然,插入一个已有的值,可以选择return了,

当while循环走完,意味着走到了对的位置了

举个例子

插入一个2,那么这个cur就得往左走,走到1位置才是正确的,

然后parent也是到了cur的位置。

然后,当前的parent的值和当前val的值相比,大于就插入右边,小于就插入左边,

显然这个例子中,2插入1的右边。

最后一个内容。

删除

这里的删除有些麻烦,要分三种情况

第一种情况

删除的节点左边为空

举个例子

这个当左边为空时,也有三种状况。

第一种:当root为删除的节点时,让root=cur.right

第二种:当cur为根节点的左边时,图中为3,既让root=cur.right

第三种:当cur为根节点的右边时,图中为7,既让root=cur.right

而根据这里我们也可以写出第一部分的代码了

public void remove(int key){TreeNode parent=null;TreeNode cur=root;while(cur!=null){if(cur.val<key){parent=cur;cur=cur.right;}else if(cur.val>key){parent=cur;cur=cur.left;}else{removeNode(parent,cur);}}}private void removeNode(TreeNode parent,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==parent.left){parent.left=cur.right;}else {parent.right=cur.right;}
}

代码解释:同样的,我们删掉节点之前,也先需要找到这个节点,删除节点的事让removeNode来做。

刚刚说明的root=cur.right中的root,当然是让一个parent来记录下来(即cur前面节点的信息)

第二种情况

即删除的节点右边为空

举个例子

同样的,这里也有三种情况

第一种:当删除的节点为根节点,所以root=cur.left

第二种:当删除的节点为root的左边,图中为3,所以root=cur.left

第三种:当删除的节点为root的右边,图中为7,所以root=cur.left

所以到这里也可以写一些代码了

 private void removeNode(TreeNode parent,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==parent.left){parent.left=cur.right;}else {parent.right=cur.right;}}else if(cur.right==null){if(cur==root){root=cur.left;}else if(cur==parent.left){parent.left=cur.left;}else{parent.right=cur.left;}

这个代码,跟第一种情况是类似的。

第三种情况

即删除的节点左右都不为空

目录

二叉搜索树:

查找

插入

删除

第一种情况

第二种情况

第三种情况

完!


举个例子

当我们要删除的节点为cur时,即图中的60,我们采用的方法是替换法,

即其一的办法是,在cur的右边找到其最小值替换掉cur,即图中的65替换掉60。

同理也可以找到cur的左边的最大值替换掉cur,

这样做是因为可以保持整棵树为一个二叉搜索树

具体这样子做(以在cur的右子树找最小值为例)

定义两个节点,一个是target,一个是targetParent。

其中,target=cur.right

targetParent=cur

让这个target去找到其最小值,找到了,再去赋值然后更新要修改的节点

修改完成后,再像其第一种情况中的当targetParent的左边为空时,让这个targetParent的左边指向

target的右边,相当于指向一个空指针,使其不再引用这个65的节点,达到删除效果

上代码

             TreeNode target=cur.right;TreeNode targetParent=cur;while(target !=null){targetParent=target;target =target.left;}cur.val=target.val;if(target ==targetParent.left){targetParent.left=target .right;}else{targetParent.right=target .right;}}

完!

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

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

相关文章

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(五)-同时支持无人机和eMBB用户数据传输的用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

全网最详细单细胞保姆级分析教程(二) --- 多样本整合

上一节我们研究了如何对单样本进行分析,这节我们就着重来研究一下如何对多样本整合进行研究分析! 1. 导入相关包 library(Seurat) library(tidyverse) library(patchwork)2. 数据准备 # 导入单样本文件 dir c(~/Desktop/diversity intergration/scRNA_26-0_filtered_featur…

【香橙派 Orange pi AIpro】| 开发板深入使用体验

目录 一. &#x1f981; 写在前面二. &#x1f981; 愉快的安装流程2.1 安装前准备2.2 流程准备2.2.1 烧录镜像2.2.2 开机2.2.3 连网2.2.4 SSH远程连接开发板 2.3 体验 AI 应用样例 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 大家好&#xff0c;我是狮子呀&…

医疗级微型导轨:保障医疗行业手术安全!

微型直线导轨能成为一种专为医疗行业设备运用的高精度线性运动设备&#xff0c;在现代医疗领域&#xff0c;精准的位置控制和平稳的运动对于确保医疗设备的高效性能至关重要。那么&#xff0c;医疗行业对微型导轨有哪些要求呢&#xff1f; 1、精度&#xff1a;在手术过程中&…

C++客户端Qt开发——开发环境

一、QT开发环境 1.安装三个部分 ①C编译器&#xff08;gcc&#xff0c;cl.exe……) ②QT SDK SDK-->软件开发工具包 比如&#xff0c;windows版本QT SDK里已经内置了C的编译器&#xff08;内置编译器是mingw&#xff0c;windows版本的gcc/g&#xff09; ③QT的集成开发…

智慧园区规划建设解决方案PPT(40页)

智慧园区规划建设解决方案摘要 1. 园区定义与发展历程 园区&#xff0c;亦称开发区&#xff0c;是在特定产业和区域政策指导下形成的区域。它们通过提供基础设施和生产空间&#xff0c;吸引投资&#xff0c;形成技术、资本密集区&#xff0c;推动经济发展。园区发展经历了四代…

Docker 部署 ShardingSphere-Proxy 数据库中间件

文章目录 Github官网文档ShardingSphere-Proxymysql-connector-java 驱动下载conf 配置global.yamldatabase-sharding.yamldatabase-readwrite-splitting.yamldockerdocker-compose.yml Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为…

【qt】TCP客户端信息的接受和发送

当有信息时的槽函数关联 跟服务端收到信息一样,当可以读一行的时候,就从套接字读一行. 发送信息也是和服务端如出一辙,通过write(). 运行结果:

Spring MVC 中的文件上传 和 文件下载

Spring MVC 中的文件上传 和 文件下载 文章目录 Spring MVC 中的文件上传 和 文件下载1. Spring MVC 中的文件上传2. Spring MVC 中的文件下载3. 总结&#xff1a;4. 最后&#xff1a; 1. Spring MVC 中的文件上传 文件上传是&#xff1a;浏览器端向服务器发送文件&#xff0c…

C 语言结构体

由于近期项目需求,需使用到大量的指针与结构体&#xff0c;为更好的完成项目&#xff0c;故对结构体与指针的内容进行回顾&#xff0c;同时撰写本博客&#xff0c;方便后续查阅。 本博客涉及的结构体知识有&#xff1a; 1.0&#xff1a;结构体的创建和使用 2.0: typedef 关…

解锁音乐密码,人工智能创作动人歌词

在音乐的神秘世界里&#xff0c;每一段旋律都像是一把等待开启的密码锁&#xff0c;隐藏着无尽的情感与故事。而如今&#xff0c;人工智能正以其独特的智慧和创造力&#xff0c;帮助我们解锁这些音乐密码&#xff0c;创作出动人的歌词。 “妙笔生词智能写歌词软件&#xff08;…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顾名思义&#xff0c;Audio音频数据缓冲提供&#xff0c;就是提供音频数据的缓冲类&#xff0c;而且这个AudioBufferProvider派生出许多子类&#xff0c;每个子类有不同的用途&#xff0c;至关重要&#xff1b;那它在Android哪个地方使…

访问 Postman OAuth 2.0 授权的最佳实践

OAuth 2.0 代表了 web 安全协议的发展&#xff0c;便于在多个平台上进行授权服务&#xff0c;同时避免暴露用户凭据。它提供了一种安全的方式&#xff0c;让用户可以授权应用程序访问服务。 在 Postman 中开始使用 OAuth 2.0 Postman 是一个流行的API客户端&#xff0c;支持 …

探索4D毫米波雷达和摄像头在自动驾驶中的潜力

随着自动驾驶技术的快速发展&#xff0c;关于各种传感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷达&#xff09;与毫米波雷达结合摄像头的作用&#xff0c;激发了激烈的讨论。在这篇博客中&#xff0c;我们将探讨4D毫米波雷达和摄像头的组合是否可能成为自动驾驶车辆…

将vue项目整合到springboot项目中并在阿里云上运行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

聊聊接入Arbitrum的正确姿势

本文首发于公众号&#xff1a;Keegan小钢 前言 我们知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 两大类。而 Optimistic Rollup 的实现方案中&#xff0c;则是 Optimism 和 Arbitrum 最受关注。而我们最近接入了 …

Java套红:指定位置合并文档-NiceXWPFDocument

需求&#xff1a;做个公文系统&#xff0c;需要将正文文档在某个节点点击套红按钮&#xff0c;实现文档套红 试了很多方法&#xff0c;大多数网上能查到但是实际代码不能找到关键方法&#xff0c;可能是跟包的版本有关系&#xff0c;下面记录能用的这个。 一&#xff1a;添加依…

redis-cli 连接Redis

Redis-cli介绍 redis-cli 是原生 Redis 自带的命令行工具&#xff0c;您可以在云主机或本地设备上通过 redis-cli 连接 Redis 数据库&#xff0c;进行数据管理。 redis-cli 客户端的使用方法&#xff0c;请参考官方文档。 连接命令 redis-cli -h <redis_instance_address…

一个极简的 Vue 示例

https://andi.cn/page/621516.html

【qt】客户端连接到服务器

获取到IP地址和端口号. 通过connectToHost() 来进行连接. 对于客户端来讲,只需要socket即可. 客户端连接服务端只需要使用套接字(Socket)来进行通信。客户端通过创建一个套接字来连接服务端&#xff0c;然后可以通过套接字发送和接收数据。套接字提供了一种简单而灵活的方式来…