数据结构与算法_BST树_BST树的定义及删除操作

news2024/10/7 16:23:26

先写BST树的定义及特点,然后记录BST数的删除操作。

1 BST定义及特点

BST数是一棵特殊的二叉树,如何能得到一颗二叉搜索树呢?下面一个有序序列,经过二分搜索,得到的就是一颗BST树。根节点就是当前一轮要搜索的中间节点。
在这里插入图片描述BST树称作二叉搜索树(Binary Search Tree)或者二叉排序树(Binary Sort Tree),它或者是一颗空树;或者是具有下列性质的二叉树:
1 、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值
2 、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值
3 、左右子树也分别满足二叉搜索树性质
特点 :每一个节点都满足 左孩子的值(不为空) < 父节点的值 < 右孩子的值(不为空);比如上图中,24 < 58 < 67
二叉树层数和节点的个数的关系;
二分搜索就是从根搜到叶子节点,因此,BST的时间复杂度是O(logN)

2 BST数删除操作

删除节点时,有两个概念需要分清楚:
前驱节点:当前节点左子树中值最大的节点。
后继节点:当前节点右子树中值最小的节点,就是右子树中最左边的值。
假设要删除的节点就是当前遍历到的节点
1 如果当前节点没有孩子节点,父节点地址域置为nullptr;
2 如果当前节点只有一个孩子节点,让父节点指向当前节点。
在这里插入图片描述
3 如果当前节点有两个孩子节点,找到当前节点的前驱节点,用前驱节点覆盖当前节点的值,然后直接删除前驱或者后继节点的值。
在这里插入图片描述
代码实现时候,先实现情况3。

	/* 功能:删除二叉树中的val节点
	*
	* 参数:
	*		const T & val: 待删除的节点
	*/
	void n_remove(const T & val)
	{
		if (root_ == nullptr)
		{
			return;
		}
		
		// 搜索待删除的节点,cur指向当前搜索的节点,parent指向cur的父节点
		Node *parent = nullptr;
		Node *cur = root_;
		while (cur != nullptr)
		{
			if (cur->data_ == val)   // 如果当前是根节点,说明找到了,先break出来,在情况1和2时处理。
			{
				break;  
			}
			else if (comp_(cur->data_, val))  // 用函数对象比较,如果当前节点值小于val,就从当前节点的右边找
			{
				parent = cur;
				cur = cur->right_;
			}
			else      // 否则就从左边找
			{
				parent = cur;
				cur = cur->left_;
			}
		}

		// 如果找不到要删除的节点,返回 
		if (cur == nullptr)
		{
			return;
		}

		// 走到这里说明已经找到了当前要删除的节点:比如上图中67的情况
		// 开始判断,先判断如果当前待删除节点有两个孩子,找孩子的前驱节点
		if (cur->left_ != nullptr && cur->right_ != nullptr)
		{
			parent = cur;
			Node *pre = cur->left_;
			while (pre->right_ != nullptr)   // 找前驱节点
			{
				parent = pre;
				pre = pre->right_;
			}
			cur->data_ = pre->data_;
			cur = pre;					// cur指向当前要删除的节点,parent指向其父节点。
		}

		// 找出parent最后指向的左孩子还是右孩子
		Node *child = cre->left_;
		if (child == nullptr)
		{
			child = cur->right_;
		}
		
		// 表示删除的是根节点:根节点的parent是空间点
		if (parent == nullptr)
		{
			root_ = child;
		}
		else 
		{
			// 把待删除节点 写入父节点中
			if (parent->left_ == cur)
			{
				parent->left_ = child;
			}
			else
			{
				parent->right_ = child;
			}
		}
		delete cur;  // 删除当前节点
	}

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

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

相关文章

Cell子刊:器官再生,这种病可以让受损的肝脏再生

麻风病是由麻风杆菌引起的一种慢性传染病&#xff0c;主要病变在皮肤和周围神经。它是世界上最古老和最顽固的疾病之一&#xff0c;但引起它的细菌也可能具有令人惊讶的生长和再生重要器官的能力。器官再生是治疗疾病、损伤或衰老功能障碍的理想策略&#xff0c;尽管体外模型、…

linux-adnroid 键值枚举与注释

一、概述 没有找到直接的linux 键值枚举的注释。在android 官网linux-android健码网页里找到了这个映射关系。因为android列的比较多。去掉冗余摘取主要对比和注释进表格。 二、术语摘抄解释 HID 用法、Linux 键码和 Android 键码 系统根据抽象层使用几个不同的标识符来引用…

【服务器数据恢复】5节点Lustre分布式文件系统RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 5台服务器节点&#xff0c;每台服务器节点配置一组RAID5&#xff0c;每组6块硬盘&#xff0c;其中1块设置为热备盘。 系统环境为Lustre分布式文件系统&#xff0c;5台服务器共同存储全部的数据文件。 服务器故障&检测&#xff1a; 机房漏水…

你被裁了需要知道的一些细节

前言 就在上周&#xff0c;得知自己要被裁了&#xff0c;理由是公司在疫情下的经济性裁员&#xff0c;在这里总结一下关于裁员过程中需要注意的一些细节。 关于工作交接 要在收到书面通知之后&#xff0c;再进行工作交接&#xff0c;否则可能面临的风险是公司卸磨杀驴。 关…

C++初阶 List的模拟实现

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者介绍&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;模拟STL中List的实现 List的模拟实现本篇博客目标节点类的实现构造函数迭代器类的实现迭代器类模拟实现的意义迭代器类的三个参数说明构造函数运算…

zabbix自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

内容预知 1.自定义监控内容 监控案例1&#xff1a;登录人数检测 具体步骤 步骤一&#xff1a;在客户端创建自定义 key 步骤二&#xff1a;在 Web 页面创建自定义监控项模板 &#xff08;1&#xff09;创建模板 &#xff08;2&#xff09;创建应用集&#xff08;用于管理…

《数据结构》顺序表ArrayList

《数据结构》顺序表ArrayList 文章目录《数据结构》顺序表ArrayList什么是顺序表:模拟实现顺序表(以int类型为例)详解ArrayList:ArrayList实现的接口:ArrayList的构造方法:对源码的解析:ArrayList的方法ArrayList的扩容机制ArrayList的缺陷什么是顺序表: 顺序表是用一段物理地…

【Hack The Box】windows练习-- acute

HTB 学习笔记 【Hack The Box】windows练习-- acute &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f…

并发入门组件AQS源码解析(未完善)

必要掌握技术 阻塞&#xff0c;唤醒与中断 阻塞与唤醒 LockSupport的park使用的是Parker->park() synchronized的wait&#xff0c;synchronized的monitorenter使用的是ParkEvent->park()&#xff0c; 而LockSupport的unpark&#xff0c;Parker->unpark() synchroni…

员工离职后,账号权限怎么自动化回收?

最近一则离职员工报复前东家的新闻引人注目。起因是该员工被公司辞退后怀恨在心&#xff0c;于是用自己的笔记本电脑入侵了前公司的服务器&#xff0c;进入了该公司的法国站、英国站、德国站三个亚马逊店铺&#xff0c;进行了大幅调低商品价格、主动向客户发起退款、调高广告预…

1525_AURIX TC275 BootROM上

全部学习汇总&#xff1a; GitHub - GreyZhang/g_TC275: happy hacking for TC275! 这一次看一个全新的章节&#xff0c;BootROM&#xff0c;这是我之前只听过但是没有接触过的一个功能。 1. BootROM包含的三个主要的功能&#xff1a;启动软件、引导加载程序、测试固件。 2. 启…

UI设计都有哪些设计原则,分享三个给你

是什么使一个好UI设计容易阅读&#xff1f;是什么让用户轻松浏览&#xff1f;设计师如何创造一个闪亮的UI&#xff1f;任何软件产品的关键部分都是用户界面。 ​好的UI设计&#xff0c;用户甚至会忽略它。如果做得不好&#xff0c;就会成为用户使用产品的绊脚石。为了更有效地设…

数字化车间认定条件

一、申报数字化车间的奖励&#xff1a; 聊城市为了支持企业开展智能制造。对新获认定的国家级智能制造示范工厂、智能制造优秀场景&#xff0c;分别给予最高100万元、50万元一次性奖励&#xff1b;对新获认定的省级智能制造系统解决方案供应商、智能制造标杆企业、智能工厂、数…

因误删文件导致CentOS7开机卡死无法进入图形登录界面

目录 1、背景 2、解决步骤 1、背景 这几天在清理电脑&#xff0c;需要删除虚拟机&#xff0c;为此写下了Linux系统下卸载VMware Workstation软件_nanke_yh的博客-CSDN博客&#xff0c;但是同时怕有残留&#xff0c;自己全局搜索了vm&#xff0c;删除了部分带有vm的文件。删除…

【GridMask】《GridMask Data Augmentation》

arXiv-2020 文章目录1 Background and Motivation2 Related Work3 Advantages / Contributions4 GridMask5 Experiments5.1 Image Classification5.2 Object Detection on COCO Dataset5.3 Semantic Segmentation on Cityscapes5.4 Expand Grid as Regularization6 Conclusion&…

MongoDB之完整入门知识(集合操作、文档基本CRUD操作、文档分页查询、索引等相关命令)

MongoDB完整入门知识一、相关概念1、简介2、体系结构3、安装网址二、MongoDB基本常用命令1、Shell连接&#xff08;mongo命令&#xff09;2、选择和创建数据库2.1 选择和创建数据库的语法格式&#xff08;如果数据库不存在&#xff0c;则自动创建&#xff09;2.2 查看有权限查看…

SpringBoot与Loki的那些事

因为网上好多都没有通过Loki的API自己实现对日志监控系统&#xff0c;所以我就下定决心自己出一版关于loki与springboot的博文供大家参考&#xff0c;这个可以说是比较实用&#xff0c;很适合中小型企业。因此我酝酿了挺久了&#xff0c;对于loki的研究也比较久&#xff0c;希望…

论文精读《OFT: Orthographic Feature Transform for Monocular 3D Object Detection》

OFT: Orthographic Feature Transform for Monocular 3D Object Detection 文章目录OFT: Orthographic Feature Transform for Monocular 3D Object Detection论文精读摘要&#xff08;Abstract&#xff09;1. 介绍&#xff08;Introduction&#xff09;2. 相关工作&#xff08…

给开源项目做一个漂亮简洁的版本迭代更新图,生成固定链接复制到介绍中、公众号菜单链接中、博客中等

背景 开源项目的版本迭代与更新经常需要更新迭代文档&#xff0c;但是readme.md没有比较美观一点的效果&#xff0c;所以文本分享一种第三方的方式&#xff1a;用TexSpire的免费在线文档分享功能&#xff0c;手机、PC、Pad都可以适配。 效果预览 使用 第一步&#xff1a;创…

浅谈 async/await 和生成器

浅谈 async/await async/await 是ES8规范新增的&#xff0c;使得以同步方式写的代码异步运行不再是白日梦&#xff0c;进一步让代码逻辑更加清晰。 为什么新增 async/await 下面有这样一个需求&#xff1a;有两个请求&#xff0c;请求 1 的结果是请求 2 的参数&#xff0c;所…