【数据结构】二叉搜索树

数据结构系列五:Map与Set(三)

二叉搜索树

一、搜索原理(有序维护)

1.插入

2.删除

2.1单子树节点

2.2双子树节点

二、搜索性能

1.排成完全二叉树

2.排成链表


二叉搜索树

每个节点都经过 整体搜索比较排 维护组成的有序树是二叉排序树,即二叉搜索树

一、搜索原理(有序维护)

依据维护成的整体有序性 左右分位判相对位置 对整体搜完来确定序位进而持续维护 有序树的整体有序性,具体要求在:

1.插入

插入元素时,搜索确定完 在路径下的所有节点的相对位置 再插入,才可确保 插入在整体下的有序维护性,所以所有的元素插入 都是插到路径末 整体树的子叶节点 空位置进行的

插入代码 

    public boolean insert(int val) {TreeNode node = new TreeNode(val);if(root == null) {root = node;return true;}TreeNode cur = root;TreeNode parent = null;//搜索到 路径末叶节点 空位置上 插入,确保能维护 元素插入的整体有序while (cur != null) {if(cur.val <val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {return false;}}if(parent.val < val) {parent.right = node;}else {parent.left = node;}return true;}

2.删除

删除节点,要维护 节点删完后 节点的子树在整体里能重新有序性

2.1单子树节点

如果删除节点 只有一棵子树,直接绕删此节点 连其子树,删除后 是维护着子树 进整体重新有序的


2.2双子树节点

如果删除节点 有两棵子树,找到子树中的 最上最端的 最值单子树节点,(左子树最右端最大,右子树最左端最小用子树的最值 往上覆盖掉 以删掉节点值,接着用单子树直接绕删的方式 删此已重复值的单子树节点 完成节点删除后 两子树重新能融整体 有序维护的删除

删除代码 

    public void remove(int val) {TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val <val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {//删除的逻辑removeNode(parent,cur);return;}}}private void removeNode(TreeNode parent,TreeNode cur) {//本质 ——> 单子树节点的删除,直接 绕删转去连 它的那棵单子树就行了//处理本质 绕删连都是相同的,但在具体操作时 面对的情况上 有点不同,要分着处理//1.删除单子树节点//1.1要删的单子树节点 左边没有树if(cur.left == null) {//1.1.1要删除的单子树节点 没有父母parent==null,在操作上有点不同,父节点空情况要防空 分开来处理操作if(cur == root) {root = cur.right;//1.1.2要删除的单子树节点 有父母 在父节点左边,要用父节点的左边去绕连}else if(cur == parent.left) {parent.left = cur.right;//1.1.3要删除的单子树节点 有父母 在父节点右边,要用父节点的右边去绕连}else {parent.right = cur.right;}//1.2要删的单子树节点 右边没有树}else if(cur.right == null) {//1.2.1要删除的单子树节点 没有父节点,父节点空情况 分着处理它if(cur == root) {root = cur.left;//1.2.2要删除的单子树节点 在父节点左边,要用父节点左边去绕连}else if(cur == parent.left) {parent.left = cur.left;//1.2.3要删处的单子树节点 在父节点右边,要用父节点右边去绕连}else {parent.right = cur.left;}//其实往一边找替罪羊去删的删法 也同样适用于 单子树节点的删除,往对应节点 对应的单子树那边 找替罪羊去删 同样也能完成,不过这里选择将它们分开来处理了//2.删除双子树节点}else {//统一用 往右子树找替罪羊的删法:TreeNode targetParent = cur;TreeNode target = cur.right;//2.1target.left==null,找到替罪羊while (target.left != null) {targetParent = target;target = target.left;}//2.2最值往上覆盖删掉 要删除节点的值:cur.val = target.val;//2.3把替罪羊节点删除://2.3.1如果替罪羊一上来 就直接在 要删除节点的右首节点,分成的情况就是 替罪羊节点在其父节点的右边的情况,要用父节点的右边去绕连删if(target == targetParent.right) {targetParent.right = target.right;}else {//2.3.2替罪羊在要删除节点 首个右节点之后的,分成的情况就是 替罪羊在其父节点的左边 的一般情况,要用父节点的左边去绕连删targetParent.left = target.right;}}}

二、搜索性能

1.排成完全二叉树

左右均匀分配有序排 建成的搜索树每次的分查 都能排掉区域一半的数据搜索性能高,当分配均匀成 完全二叉树时,搜索的次数为 树的高度log(n) 就能查到数据


2.排成链表

单分支分配有序排成的搜索树 退化成链表每次的分查 都不能排额外数据搜索性能低下搜索的次数为 树的高度 为链表的长度n

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【无标题】

一、Matplotlib 基础认知 功能特性&#xff1a;是 Python 强大的绘图库&#xff0c;能将数据以多样化的图表形式呈现&#xff0c;涵盖静态、动态和交互式图表&#xff0c;支持多种输出格式&#xff0c;满足不同场景下的数据可视化需求。 二Matplotlib Pyplott 函数绘图技巧&a…

wangEditor 移除表情包菜单项的配置步骤‌

wangEditor 移除表情包菜单项的配置步骤‌ 1. 确认表情包菜单项的 Key‌‌2. 配置 excludeKeys 排除表情包‌‌3. 验证配置生效‌注意事项‌ 1. 确认表情包菜单项的 Key‌ ‌默认 Key 为 emotion‌&#xff1a;根据工具栏默认配置&#xff0c;表情包菜单项的 Key 为 emotion。…

正则表达式详解

文章目录 1. 正则表达式基础1.1 什么是正则表达式1.2 为什么需要学习正则表达式1.3 Java中的正则表达式支持2. 正则表达式语法2.1 基本匹配2.2 元字符2.2.1 常用元字符2.2.2 转义字符2.2.3 字符类2.2.4 预定义字符类2.2.5 量词2.3 贪婪与非贪婪匹配2.4 分组与捕获2.4.1 命名分组…

MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略

MLLM之Bench&#xff1a;LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略 目录 LEGO-Puzzles的简介 1、LEGO-Puzzles的特点 LEGO-Puzzles的安装和使用方法 1、安装 步骤 0&#xff1a;安装 VLMEvalKit 步骤 1&#xff1a;设置 API 密钥&#xff08;可选&#xf…

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官&#xff1a;请解释Spring Boot中自动配置的工作原理并演示如何自定义一个ConfigurationProperties组件&#xff1f; xbhog&#xff1a;自动配置通过EnableAutoConfiguration注解触发&#xff0c;结合当前环境判断&#xff08;如是否检测到MyBatis依赖&…

STM32 定时器TIM

定时器基础知识 定时器就是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32总共有8个定时器&#xff0c;分别是2个高级定时器(TIM1、TIM8)&#xff0c;4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7)&#xff0c;如下图所示: STM32F1…

NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”

4月22日至24日&#xff0c;生产设备暨微电子工业展&#xff08;NEPCON China 2025&#xff09;在上海如期开展。本届展会重磅推出“人形机器人拆解展区”&#xff0c;汇聚35家具身智能产业链领军企业&#xff0c;围绕机械结构、传感器布局、驱动系统与AI算法的落地应用&#xf…

操作系统:计算机世界的基石与演进

一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家"&#xff0c;在硬件与应用之间架起关键桥梁。从不同视角观察&#xff0c;其核心功能呈现多维价值&#xff1a; 硬件视角的双重使命&#xff1a; 硬件管理者&#xff1a;通过内存管理、进程调度和设…

C++动态分配内存知识点!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;又是分享干货的时间&#xff0c;今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…

2025.4.26总结

今天把马良老师的《职场十二法则》看完后&#xff0c;感触极大&#xff0c;这们课程就是一场职场启蒙课。 虽然看过不少关于职场的书籍&#xff0c;但大多数是关于职场进阶&#xff0c;方法方面的。并没有解答“面对未来二三十年的职场生涯&#xff0c;我该怎么去看待自己的工…

在Spring Boot项目中实现Word转PDF并预览

在Spring Boot项目中实现Word转PDF并进行前端网页预览&#xff0c;你可以使用Apache POI来读取Word文件&#xff0c;iText或Apache PDFBox来生成PDF文件&#xff0c;然后通过Spring Boot控制器提供文件下载或预览链接。以下是一个示例实现步骤和代码&#xff1a; 1. 添加依赖 …

计算机视觉——对比YOLOv12、YOLOv11、和基于Darknet的YOLOv7的微调对比

概述 目标检测领域取得了巨大进步&#xff0c;其中 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 在实时检测方面表现出色。尽管这些模型在通用目标检测数据集上表现卓越&#xff0c;但在 HRSC2016-MS&#xff08;高分辨率舰船数据集&#xff09; 上对 YOLOv12 进行微调时&…