什么是搜索树

搜索树是一种树形数据结构,用于高效地存储和检索数据。其核心特点是每个节点包含一个键(Key),并遵循特定的排序规则。常见的搜索树有二叉搜索树、自平衡二叉树、多叉搜索树等。AVL树、红黑树、Splay树都属于自平衡二叉树。

二叉搜索树

什么是二叉搜索树

1、是一棵二叉树
2、左子树所有节点值的大小 < 当前节点值的大小
3、右子树所有节点值的大小 > 当前节点值的大小
4、子树也满足上述条件
下图就是一棵二叉搜索树:
在这里插入图片描述
根据二叉搜索树的性质,当我们中序遍历这棵树的时候,发现它是按照顺序进行排序的。(上面中序排序为:10、20、30、40、50、60、70、80)

二叉搜索树的基本操作

查找

根据二叉搜索树的性质,“左边的值”都比节点的值小,“右边的值”都比节点的值大。这样我们查找的时候就可以直接排除了一边子树。

代码展示:
public TreeNode search(int key) {if(root == null) {return null;}TreeNode cur = root;while (cur != null) {if(cur.value == key) {return cur;}else if(cur.value > key) {//说明key在左树cur = cur.left;}else {//说明key在右树cur = cur.right;}}return null;//当整棵树都没有找到key,返回null
}
代码分析:

时间复杂度:最好情况下(根节点就是要找的):O(1);平均情况下:O(logN) —> 每次比较可以排除一半的节点,类似二分查找;最坏情况下(树是一棵单边树,也看成链表):O(N) -----> 需要遍历每个节点。

为了解决二叉搜索树存在的问题,就有了AVL树、红黑树

插入

插入数据后,还是要满足二叉搜索树的性质的。插入操作一般都是在叶子节点位置进行的。这是为了保证插入后树依然保持二叉搜索树的性质,并且不需要对已有的其他节点结构进行调整。

代码展示:
public boolean insert(int val) {TreeNode node = new TreeNode(val);//当二叉树为空,直接插入if(root == null) {root = node;return true;}TreeNode cur = root;//用来找到遍历二叉树TreeNode prev = null;//用来找到cur父亲节点while (cur != null) {if(cur.value == val) {return false;}else if(cur.value > val) {prev = cur;cur = cur.left;//根据性质,需要在左子树进行插入,cur向左子树移动。}else {prev = cur;cur = cur.right;//根据性质,需要在右子树进行插入,cur向右子树移动。}}//此时cur为null,prev指向cur父亲节点//根据prev的值决定将新节点插入左子树还是右子树if(prev.value > val) {prev.left = node;}else {prev.right = node;}return true;
}
代码分析:

时间复杂度:平均情况下:O(logN);最坏情况下(树是一棵单边树,也看成链表):O(N)。

删除

代码展示:
public void remove(int val) {if(root == null) {return;}TreeNode cur = root;TreeNode parent = null;if(cur.val > val) {parent = cur;cur = cur.left;}else if(cur.val < val) {parent = cur;cur = cur.right;}else {parent = cur;removeNode(cur,parent);//通过上述代码找到要删除的节点,再通过removeNode(cur,parent)方法删除节点}
}
//删除节点的方法
private void removeNode(TreeNode cur, TreeNode parent) {//1、cur.left == null:要删除的节点只有右节点if(cur.left == null) {if(cur == root) { //1.1、cur为root,则root = cur.rightroot = cur.right;//要删除的为根节点,根节点往后移}else {if(cur == parent.right) {//1.2、cur不为root,cur为父亲节点(parent)的右结点parent.right = cur.right;//让parent的右节点指向cur的右节点,跳过cur}else {//1.3、cur不为root,cur为父亲节点(parent)的左结点parent.left = cur.right;//让parent的左节点指向cur的右节点,跳过cur}}}else if(cur.right == null) {//2、cur.right == nullif(cur == root) { //2.1、cur为root,则root = cur.leftroot = cur.left;//要删除的为根节点,根节点往后移}else {if(cur == parent.right) {//2.2、cur不为root,cur为父亲节点(parent)的右结点parent.right = cur.left;//让parent的右节点指向cur的左节点,跳过cur}else {//2.3、cur不为root,cur为父亲节点(parent)的左结点parent.left = cur.left;//让parent的左节点指向cur的左节点,跳过cur}}}else {//3、cur.left != null && cur.right != null//这里的删除相当于替换删除。在以cur为root的树中,在右树找到最左边的节点(或者在左树找到最右边的节点)TreeNode target = cur.right;TreeNode targetParent = cur;while (target.left != null) {//在右树找到最左边的节点targettargetParent = target;target = target.left;}cur.val = target.val;//target在targetParent的左右子树位置不一样,删除方式不一样if(target == targetParent.left) {targetParent.left = target.right;}else {targetParent.right = target.right;}}
}
代码分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

语音交互新纪元:Hugging Face LeRobot如何让机器人真正“懂你”

机器人之言&#xff1a;早在2024年&#xff0c;Hugging Face正式进军真实世界机器人应用领域&#xff0c;推出了开源机器人项目LeRobot。LeRobot不仅仅是一个模型库&#xff0c;它是一个完整的机器人学习平台&#xff0c;融合了模仿学习、强化学习、数据可视化以及仿真环境。其…

搭建个人博客系列--MySql

前期提要&#xff1a;搭建个人博客系列--docker-CSDN博客 目前已经拥有了docker所以只需要将MySql安装在docker上即可。 一、在docker安装mysql docker pull mysql 二、查询docker内的mysql镜像 三、启动msql docker run -d -p 33060:3306 -v /home/mysql/conf:/mysql/conf.d…

【Spring】Spring Boot + OAuth2 + JWT + Gateway的完整落地方案,包含认证流程设计

Spring Boot OAuth2 JWT Gateway的完整落地方案&#xff0c;包含认证流程设计网关在服务中的使用一、整体架构设计二、核心组件实现1. OAuth2认证服务器&#xff08;auth-service&#xff09;2. JWT自定义增强&#xff08;存储用户信息&#xff09;三、Gateway全局拦截&…

第一个小程序

一、前言随着移动互联网的发展&#xff0c;用户对“即用即走”的轻量级应用需求日益增长&#xff0c;而传统 App 在下载安装、更新维护等方面存在一定的门槛。小程序应运而生&#xff0c;它是一种无需下载即可使用的应用程序形态。本文将带你完成人生中第一个微信小程序的开发全…

【办公类-54-07】20250901 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)

背景需求: 制作了校历单后,第二个要制作的就是点名册(灰色版) 【办公类-54-03】20240828班级点名册模版(双休国定假涂成灰色)2024学年第一学期_姓名周一到周五的点名册怎么画-CSDN博客文章浏览阅读2.1k次,点赞24次,收藏4次。【办公类-54-03】20240828班级点名册模版(…

iOS App首次启动请求异常调试:一次冷启动链路抓包与初始化流程修复

在一次 iOS App 大版本更新后&#xff0c;部分用户反馈首次打开 App 时会出现“无法连接服务器”的提示&#xff0c;需要重启 App 才能正常使用。而后续使用过程中接口调用都正常。服务器端并未记录请求到达&#xff0c;日志中只有 sporadic&#xff08;零星&#xff09;断连记…

【Linux网络篇】:网络中的其他重要协议或技术——DNS,ICMP协议,NAT技术等

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录其他重要协议或技术1.DNS2.ICMP协议3.NAT技术4.代理服务器其他重…

HarmonyOS学习4 --- 创建一个页面

1、声明式UI语法Entry Component struct My_page {State isLogin: boolean falsebuild() {Row() {Image(this.isLogin ? $r(app.media.icon_leon) : $r(app.media.icon)).height(60).width(60).onClick(() > {this.isLogin !this.isLogin})Text(this.isLogin ? $r(app.s…

【Java EE】Spring MVC 的使用

1. 路由映射&#xff1a;RequestMapping&#xff1a;当用户访问某个 URL 时&#xff0c;该注解会根据 URL 的路径映射到具体的程序中对应的类或方法&#xff08;路由映射&#xff09;。修饰方法时&#xff0c;路径为类路径 方法路径。默认情况下同时支持 GET 和 POST&#xff…

pip 安装默认切换到国内镜像(清华园,阿里云等)

国内Python包镜像地址如下&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple/中国科技大学&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/华为云&#xff1a;https://repo.huaweiclou…

AI agent 学习

参考&#xff1a; AI搜索DeepResearch&#xff1f;_大模型 deepsearch 深度搜索-CSDN博客 Agent是以大语言模型为大脑驱动的系统&#xff0c;具备自主理解、感知、规划、记忆和使用工具的能力&#xff0c;能够自动化执行和完成复杂任务。 自主性和自适应&#xff0c;是判断一款…

【PTA数据结构 | C语言版】求单链表list中的元素个数,即表长

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个整数顺次插入一个初始为空的单链表的表头。最后输出单链表的表长。 本题旨在训练学习者熟悉单链表的基本操作&#xff0c;不建议直接输出 n。 输入格式&#xff1a;…

玩转Docker | 使用Docker部署HomeBox家庭库存管理工具

玩转Docker | 使用Docker部署HomeBox家庭库存管理工具 前言一、HomeBox介绍Homebox简介主要特点主要使用场景二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署HomeBox服务下载HomeBox镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Hom…

QT中的常用控件-QWidget的enable属性

QT中的常用控件-QWidget的enable属性 enable描述了一个控件是否处于“可用”状态 与之相对应的概念是“禁用”&#xff0c;禁用是该控件不能接受任何用户的输入事件&#xff0c;并且外观上往往是灰色的 如果一个Widget被禁用&#xff0c;则该Widget的子元素也被禁用API说明IsEn…

【数据结构】复杂度分析

目录 一、算法 1.基本概念 2.描述方法 3.算法效率 二、算法的时间复杂度 三、算法的空间复杂度 一、算法 1.基本概念 通俗的讲&#xff0c;算法是解决问题的方法&#xff0c;比如在现实生活中一道菜谱&#xff0c;一个安装轮椅的操作指南等。 严格的说&#xff0c;算法…

推荐系统基础 --ShusenWang

学习b站up主的ShusenWang的推荐系统笔记 指标 任何系统/算法/模型都需要评估&#xff0c;对于推荐系统的指标有消费指标和北极星指标&#xff0c;消费指标是衡量用户对产品的使用情况&#xff0c;使用频率广度和深度&#xff0c;用于了解用户的使用习惯&#xff0c;北极星指标是…

linux wsl2 docker 镜像复用快速方法

GitHub项目中的devcontainer.json、Dockerfile构建了一个A项目的镜像环境&#xff0c;现在我有一个文件夹&#xff0c;文件夹中只有一个b.py文件&#xff0c;此时我希望使用A项目的环境&#xff0c;如何实现&#xff1f;注意&#xff1a; 建议使用下面的方法2 解决方案&#xf…

(生活比喻-图文并茂)http2.0和http3.0的队头阻塞,http2.0应用层解决,TCP层存在,3.0就是彻底解决,到底怎么理解区别???

说明一下&#xff1a; http属于应用层协议&#xff0c;TCP和udp属于传输层协议 文章目录阶段一&#xff1a;HTTP/1.1 的情况&#xff08;单车道收费站&#xff0c;一次过一辆&#xff09;阶段二&#xff1a;HTTP/2 的情况&#xff08;多车道收费站&#xff0c;但出口只有一条路…

ARM环境openEuler2203sp4上部署19c单机问题-持续更新

问题01、报错如下orcl:/home/oracledb15> export CV_ASSUME_DISTIDRHEL8 orcl:/home/oracledb15> $ORACLE_HOME/runInstaller -applyPSU /soft/37642901 Exception in thread "main" java.lang.UnsatisfiedLinkError: /u01/app/oracle/product/19.0.0/db_1/oui…

php成绩分析系统单科分数分布分析202507

提交二维数据表&#xff0c;识别成绩科目显示科目选择&#xff0c;选择科目后显示样本数,平均分,最高分,最低分,中位数,柱状图图表显示各分值人数分布&#xff0c;表格显示统计数据。 技术&#xff1a;html5css3ajaxphp 原生代码实现。 效果图&#xff1a; 下载&#xff1a; …