二叉搜索树的删除操作(详细图解和代码解析)

二叉排序树的定义:

        二叉排序树(Binary Search Tree,BST)是一种二叉树,其中每个节点的值大于其左子树中任意节点的值,小于其右子树中任意节点的值。换句话说,对二叉排序树进行中序遍历时,节点的值是按照升序排列的。

二叉排序树具有以下特点:

  1. 左子树中的所有节点的值均小于根节点的值。
  2. 右子树中的所有节点的值均大于根节点的值。
  3. 左子树和右子树也分别是二叉排序树。

二叉排序树可以用于快速查找、插入和删除操作,时间复杂度为O(logn),其中n为树中节点的个数。如下图就是一个简单的二叉排序树:

二叉排序树的中序是一个严格递增序列(二叉排序树中不允许存在值相同的节点);

对于删除二叉排序树的节点,我们可以分情况讨论:

1.删除左子树为空的节点

如图我们要删除节点值为1的节点,它的左子树为空 , 这里我们使用链表来实现树,即节点包含 *left 、*right、val 这三个成员变量。

首先在删除 节点值为1的节点时 首先要找到它的父亲节点,即节点值为3的节点,我们将节点值为3的节点称为 A节点 ,节点值为1的节点称为 B节点。

然后我们直接让 A指向B的指针指向B节点的右子树即可!!! 本图就是 A的left 指向B的right;

A->left = B->right;

注意此处要判断 B 是 A 的左节点还是右节点。

2.删除右子树为空的节点

我们还是以删除 B节点为例 ,大致流程还是和上述删除左子树为空的节点相同,先找到 删除节点的父节点 A, 然后将 A指向B的指针指向B的左子树。此处仍要判断  B 是 A的左节点还是右节点

本图中: A->left = B->left;

3.删除叶子节点(即左右节点都为空)

叶子节点的左右节点都为空,和上述的 两个情况相同,故不考虑。

4.删除节点的左右节点都不为空

如下图:我们要删除 B 节点,我们此时是二叉树,直接删除节点并直接相连是不行的。我们此处采用 替换法 (即 寻找删除节点 B 的左子树的最大节点 或者 右子树的最小节点)

如图: B节点的左子树 包含节点 0和节点 1 (最大节点为 1) ,它的右子树包含节点 2(最小节点为2);

我们此处采用节点值为 0 的节点 C 替代。

         找到 C 节点后将 要删除节点 B节点的值和 C节点的值替换,此时我们只要删除 C 节点即可!

在本图中,C 节点恰恰是 B的子节点,为了避免这种特例,我们将 C的父亲节点 定义为 D节点;

我们只要删除 C节点,由于我们寻找的是 B 的左节点的最大值,根据排序二叉树的性质(左小根,右大根),所以就一定表明了,C没有右节点!!!!

所以,我们仅仅让 D指向C的指针指向 C的左子树即可!注意要判断 C是D的左节点还是右节点,

本题中就是:  D->left = C->left;

代码实现如下:其实并不难,只是要分类讨论:

 此处代码实现删除左右子树都不为空的情况,采用 右子树最小节点替换方式  

//搜索树不允许修改
//替换法:  找一个 节点的值 替代
//找 要删除节点的 左子树最大节点 或者 右子树的最小节点
bool Erase(const k& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else//找到要删除节点{//进行删除操作if (cur->_left == nullptr)//左为空,父节点指向子节点右{if (cur == _root)//删除头结点{_root = cur->_right;}else{if (cur == parent->_left)//删除节点在父节点左parent->_left = cur->_right;elseparent->_right = cur->_right;}delete cur;}else if (cur->_right == nullptr)//右为空,找左{if (cur == _root)//删除头结点{_root = cur->_left;}else{if (cur == parent->_left)parent->_left = cur->_left;elseparent->_right = cur->_left;}delete cur;}else // 左右子树都有,采用替换法{//找 右子树的最小节点Node* rightMin = cur->_right;Node* rightMinParent = cur;while (rightMin->_left){rightMinParent = rightMin;rightMin = rightMin->_left;}swap(cur->_key, rightMin->_key);//判断 rightMin 是 rightMinPatent 的左右节点if (rightMinParent->_right == rightMin){rightMinParent->_right = rightMin->_right;}else{rightMinParent->_left = rightMin->_right;}delete rightMin;}return true;}}return false;
}

感谢大家看到这里,如果这篇文章对大家有一定的帮助,请大家点赞支持,如果还有一点模糊概念,可以写在评论区,我会顺着评论回答问题,最后祝大家学业有成,早日拿到心仪offer !!!

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

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

相关文章

MIGO增强(扩展字段,屏幕增强字段,常规保存增强)

1.MIGO前台增强: 1.SE18找到增强点:MB_GOODSMOVEMENT 2.找到相应的BADI:右键创建实施 3.找到重写的方法 METHOD if_ex_mb_document_badi~mb_document_before_update.DATA:lv_stat TYPE c,lv_type TYPE bapi_mtype,lv_msg TYPE bapi_msg.DATA:lv_message TYPE string.IF sy-tc…

vncsever ,window 远程ubuntu远程界面安装方式,VNC Viewer安装教程+ linux配置server 操作

linux 端安装 # 安装VNC 服务器软件 sudo apt install autocutsel # 剪切黏贴操作支持的包 sudo apt-get install tightvncserver # 安装的是 VNC 服务器软件&#xff0c;用于远程桌面访问 # 安装Xfce桌面环境 sudo apt-get install xfce4 xfce4-goodies #安装的是 XFCE 桌…

前端 JS 经典:通用性函数封装思路

前言&#xff1a;设计通用性函数&#xff0c;我们需要考虑两个方面&#xff0c;一个是函数传参的可能性&#xff0c;如果可能性很多&#xff0c;我们可以将处理参数的方法暴露出去&#xff0c;让使用者去设计。为了调用的方便性&#xff0c;我们还可以做参数的归一化。 举个例…

web自动化(一)selenium安装环境搭建、DrissionPage安装

selenium 简介 selenium是企业广泛应用的web自动化框架 selenium 三大组件 selenium IDE 浏览器插件 实现脚本录制 webDriver 实现对浏览器进行各种操作 Grid 分布式执行 用例同时在多个浏览器执行&#xff0c;提高测试效率 问题&#xff1a;环境搭建复杂&#xff0c;浏览器版…

YOLOv8+SwanHub+作物检测:从可视化训练到Demo演示

1. 项目介绍 本项目旨在利用先进的YOLOv8深度学习模型对麦穗进行高效、准确的检测。我们采用了GlobalWheat数据集&#xff0c;该数据集包含丰富的麦穗图像&#xff0c;为模型的训练提供了有力的数据支持。通过该实验&#xff0c;实现高准确率的麦穗识别&#xff0c;为农业生产提…

Webpack: 如何借助预处理器、PostCSS 等构建现代 CSS 工程环境

概述 在开发 Web 应用时&#xff0c;我们通常需要编写大量 JavaScript 代码 —— 用于控制页面逻辑&#xff1b;编写大量 CSS 代码 —— 用于调整页面呈现形式。问题在于&#xff0c;CSS 语言在过去若干年中一直在追求样式表现力方面的提升&#xff0c;工程化能力薄弱&#xff…

Studio One 6.6.2中文破解版安装图文激活教程

Studio One 6.6.2中文破解版做为新生代音乐工作站&#xff0c;凭借更低的价格和完备的功能&#xff0c;获得了音乐人和直播行业工作者的青睐&#xff0c;尤其是对硬件声卡的适配支持更好&#xff0c;特别适合用来配合线上教学和电商带货。 最近网上出现不少关于StudioOne不能用…

html侧导航栏客服栏

ico 替换 ICO <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>返回顶部</title><script src"js/jquery-2.0.3.min.js"…

基于 ESP8266 和 MQ 气体传感器的微信告警系统设计与实现

接线: ESP8266MQ3vVCCGND GND A0 A0微信通知截图: 摘要:本文主要探讨了一种利用 ESP8266 微控制器与 MQ 气体传感器构建的气体检测微信告警系统。详细阐述了系统的硬件组成、软件设计以及与微信平台的交互机制。通过该系统,能够实时监测环境中的气…

VPS搭建论坛和社区网站有哪些优势?

想象一下&#xff1a;您已经建立了一个论坛。这是您的骄傲和喜悦——一个熙熙攘攘的在线多人广场&#xff0c;人们聚集在这里不仅可以聊天&#xff0c;还可以交流、分享和辩论。不过突然出现下面这些情况&#xff0c; 页面加载需要很长时间&#xff1b;光标不停旋转。会员流失…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

STL——常用算法(二)

一、常用拷贝和替换算法 1.copy #include <iostream> #include <vector> #include <algorithm> using namespace std; void printVector(int val) {cout << val << " "; } void test01() {vector<int>v1;for (int i 0; i <…

【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)

实现在CoppeliaSim环境中进行手眼标定和目标追踪的一个例子。它主要涉及到机器人、机器视觉和控制算法的编程&#xff0c;使用了Python语言。接下来对该代码的主要类和方法进行解析&#xff1a; 1. 导入相关库 用于与CoppeliaSim模拟器通过ZeroMQ接口通信。包含Rotation类&…

SF-YOLOv5——基于改进的特征融合模式的轻量级小目标检测算法

概述 提出了一种改进的YOLOv5模型&#xff0c;名为Small-Fast-YOLOv5 (SF-YOLOv5)&#xff0c;专门用于小目标检测。通过合理裁剪大目标检测层的特征图输出&#xff0c;显著减少了模型所需的计算资源&#xff0c;使模型变得更加轻量级。 还提出了一种改进的特征融合方法&#…

CV每日论文--2024.6.24

1、Whiteboard-of-Thought: Thinking Step-by-Step Across Modalities 中文标题&#xff1a;思维白板&#xff1a;跨模式逐步思考 简介&#xff1a;这段话描述了一种利用思维白板提示来增强大型语言模型在视觉推理任务中的性能的方法。 人类在解决需要视觉思考的问题时,通常会…

英语口语练习评测的开发实现

英语口语评测是一个复杂的系统&#xff0c;需要综合考虑语音识别、语音评测、自然语言处理等多种技术。以下是一些常见的英语口语评测开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 基于语音识别的口语评测框架这种框架主要…

第28课 绘制原理图——绘制导线

概述 放置完元器件之后&#xff0c;接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令&#xff0c;进入绘制导线的过程。 点击选择某个管脚或电源端口&#xff0c;作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

React@16.x(40)路由v5.x(5)常见应用场景(2)- 实现类似 vue 的路由模式

目录 1&#xff0c;vue-router2&#xff0c;React 模拟实现 1&#xff0c;vue-router vue 的路由配置文件&#xff0c; // src/router/index.ts const routes [{path: "/news",children: [{ path: "", component: NewsView },{ path: "detail"…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月&#xff0c;ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播&#xff0c;每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名&#xff0c;但二者并没有其他共同点。 功能 自从 2021 年 10 …

养殖自动化通风系统:未来畜牧业的智能守护者

在现代畜牧业中&#xff0c;养殖环境的控制对于动物的健康成长和养殖业者的成功至关重要。养殖自动化通风系统凭借其先进技术和精密设备&#xff0c;实现了对养殖场内环境条件的精准调控&#xff0c;显著提升了养殖效率和动物福利。本文将深入探讨养殖自动化通风系统的必要性、…