二叉搜索树——迭代实现

news2024/11/28 10:33:44

————————————————————
普通的树形结构中数据是杂乱无章的,实际意义不大,要想更好的管理数据,需要让数据有序,二叉搜索树又称二叉排序树,是一种特殊的树形结构。
规定一般的二叉搜索树的左节点小于父节点,右节点大于父节点,节点均不相等
图例:
在这里插入图片描述

学习一种数据结构,自然要学会模拟实现它的增删查改啦,废话不多说,开始手撕搜索树吧。

(完整代码已放至gitee,按需参考,如有错误欢迎指出)

https://gitee.com/chxchenhaixiao/test_c/commit/4b77962a29e603679f9d21ecabdd87cb5a15e5e5

一、定义节点结构

这一步非常简单,不需要过多思考

template<class K>
struct BSTreeNode{

	K _key;
	BSTreeNode* left;
	BSTreeNode* right;
	
	BSTreeNode(K key)
		:_key(key)
		,left(nullptr)
		,right(nullptr)
	{}	//不要忘记写构造函数
};

二、定义搜索二叉树类

template<class K>
class BSTree{
private:	//protected:也可
	typedef BSTreeNode Node;//定义内部类型
	Node* _root=nullptr; //只需要存根节点
	//……
public:
	//……
};

三、查找实现
也非常简单,严格遵守二叉搜索树特征

如果目标值小于当前值,左走
如果目标值大于当前值,右走
如果当前值为空,则找不到

bool Find(const K& key){
	Node* cur = _root;
	while(cur){
		if(key<cur->_Key)
			cur=cur->left;
		else if(key>cur->_key)
			cur=cur->right;
		else
			return true;
	}
	return false;
}

四、插入实现

情形一:
当前节点数为0,直接更新_root即可
情形二:
当前节点数大于0,需要找到符合要求的位置

bool Insert(const K& key){
	Node* node = new Node(key);
	Node* prev=nullptr;	//需要记录前一个位置方便链接新节点
	Node* cur=_root;
	if(_root==nullptr)
		_root=node;
	else{
		while(cur){
			prev=cur;
			if(key<cur->_key)
				cur=cur->left;
			else if(key>cur->right)
				cur=cur->right;
			}
			else
				return false;
		//
		if(prev->left==cur)
			prev->left=node;
		else
			prev->right=node;
		/*这一步很重要,一定要进行判断所找到的空
		节点是在prev的左还是右*/
	}
	return true;
}

五、删除实现
删除的情形可以分为三种:
1、目标节点为叶子节点:
在这里插入图片描述
2、目标节点只有单个孩子节点:
在这里插入图片描述
3、目标节点左右孩子均存在:
在这里插入图片描述

针对不同的情形,要采取不同的方式

对于第一种情况,只需要将目标节点的父节点中的一个指针置为空
对于第二种情况,需要将目标节点的孩子节点交给父节点

加入把空指针也算作一个节点,那么前两种情形即可归并为一类

对于第三种情况,不能像前两种一样了,而是需要寻找目标节点右(左)子树的最小(大)节点与目标节点交换,再将问题转变为前两种情形

bool Erase(const K& key) {
		if (Find(key) == false)
			return false;
		
		Node* cur = _root;
		Node* prev = nullptr;
		
		while (key != cur->_key) {
			prev = cur;
			if (key < cur->_key) {
				cur = cur->left;
			}
			else {
				cur = cur->right;
			}
		}
		
		if (cur->left == nullptr) {
			if (prev == nullptr) {
				_root = cur->right;
			}
			else {
				if (prev->left == cur) {
					prev->left = cur->right;
				}
				else {
					prev->right = cur->right;
				}
			}
			delete cur;
		}
		else if (cur->right == nullptr) {
			if (prev == nullptr) {
				_root = cur->left;
			}
			else {
				if (prev->left == cur) {
					prev->left = cur->left;
				}
				else {
					prev->right = cur->left;
				}
			}
			delete cur;
		}
		else {
			Node* MinRight = cur->right;
			Node* pMinRight = cur;
			while (MinRight->left) {
				pMinRight = MinRight;
				MinRight = MinRight->left;
			}
			cur->_key = MinRight->_key;
			
			if (pMinRight->left == MinRight)
				pMinRight->left = MinRight->right;
			else {
				pMinRight->right = MinRight->right;
			}
			
			delete MinRight;
		}
		return true;
	}

几个易错点:
1、
在这里插入图片描述
不要忘记这里的判断,如果没有这一句,
当删除一颗歪脖树的根节点会崩溃
在这里插入图片描述
2、
在这里插入图片描述
pMinRight的初值不可以为空
在这里插入图片描述
否则删除10时,pMinRight不会得到更新,会导致运行崩溃
3、
在这里插入图片描述
这里的判断少不得,可以不要以为目标节点的右子树一定是链接在父节点的左边
也许目标节点的父节点是根节点
在这里插入图片描述
(删除8时就需要将10的右树链接在pMinRight右)

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

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

相关文章

Kettle如何连接SQL Server和问题处理

简介 Kettle&#xff08;也称为 Pentaho Data Integration&#xff09;是一款开源的 ETL&#xff08;Extract, Transform, Load&#xff09;工具&#xff0c;由 Pentaho 开发。ETL 是指从一个数据源&#xff08;通常是数据库&#xff09;中提取数据&#xff0c;进行转换&#…

多元统计分析课程论文-聚类效果评价

数据集来源&#xff1a;Unsupervised Learning on Country Data (kaggle.com) 代码参考&#xff1a;Clustering: PCA| K-Means - DBSCAN - Hierarchical | | Kaggle 基于特征合成降维和主成分分析法降维的国家数据集聚类效果评价 目录 1.特征合成降维 2.PCA降维 3.K-Mean…

Redis哨兵模式的搭建

文章目录 1、原理2、准备2.1、服务器准备2.2、资源准备 3、Redis 主从搭建3.1、Redis 安装3.2、redis.conf 配置3.2.1、Redis 主配置3.2.2、Redis 从配置 3.3、Redis 启动3.4、Redis 状态3.4.1、master 节点信息3.4.2、slave节点信息 4、哨兵配置4.1、sentinel.conf配置4.2、re…

ChatGPT-用ChatGPT指令,自学任何领域的系统知识

1. 指令位置 Github仓库&#xff1a;Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本&#xff0c;并且打开代码解释器 2 使用 学习内容 开始学习 AI甚至可以给你思考题&#xff0c;给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 推…

1Panel使用GMSSL+Openresty实现国密/RSA单向自适应

本文 首发于 Anyeの小站&#xff0c;转载请取得作者同意。 前言 国密算法是国家商用密码算法的简称。自2012年以来&#xff0c;国家密码管理局以《中华人民共和国密码行业标准》的方式&#xff0c;陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”&a…

iOS如何一键清除剪贴板中的所有内容

参考:https://www.jb51.net/shouji/746688.html 1.打开“快捷指令”应用&#xff0c;前往“快捷指令中心”&#xff0c;下拉找到“巧用剪贴板”并点击“查看全部”。 2.下拉到底部&#xff0c;点击“清除剪贴板中的所有内容”&#xff0c;然后选择“添加快捷指令”&#xff1a…

sdxl-turbo、playground文生图模型使用案例

1、sdxl-turbo SDXL-Turbo是一种快速生成的文本到图像模型,可以在单个网络评估中从文本提示合成逼真的图像。 参考:https://huggingface.co/stabilityai/sdxl-turbo 对比效果相比PixArt模型差很多,参考https://blog.csdn.net/weixin_42357472/article/details/135520142 …

MySQL数据库基础(八):DML数据操作语言

文章目录 DML数据操作语言 一、DML包括哪些SQL语句 二、数据的增删改&#xff08;重点&#xff09; 1、数据的增加操作 2、数据的修改操作 3、数据的删除操作 DML数据操作语言 一、DML包括哪些SQL语句 insert插入、update更新、delete删除 二、数据的增删改&#xff08…

05.QT坐标系

1. 坐标系原点 坐标系原点就是屏幕/窗口的左上角&#xff0c;X向右增长&#xff0c;Y向下增长。 2.设置控件位置 设置控件位置&#xff0c;就相当于是需要指定控件的坐标&#xff0c;对于该控件来说&#xff0c;其坐标原点是其父窗口/父控件的左上角。 设置方法就是通过控件的…

认识ansible,了解常用的模块

ansible的概念 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

VS code常用插件

1.Auto Close Tag &#xff08;自动闭合HTML/XML标签&#xff09; 2.Auto Rename Tag &#xff08;自动完成另一侧标签的同步修改&#xff09; Beautify &#xff08;格式化 html ,js,css&#xff09; 4.Bracket Pair Colorizer&#xff08;将匹配的括号染成相同的颜色&#xf…

利用 pt-archiver 实现数据库归档功能

文章目录 一、前言关于Percona 二、Percona Toolkit安装 percona-toolkit&#xff1a;pt-archiver 归档命令的使用格式&#xff1a;示例&#xff1a; 三、归档步骤&#xff1a;1&#xff09;、创建归档数据库和归档表方式一(推荐)&#xff1a;这种方式的优缺点&#xff1a; 方式…

【软考问题】-- 13 - 知识精讲 - 项目绩效域管理

一、基本问题 问题1&#xff1a;干系人绩效域的预期目标主要包含什么&#xff1f; ①与干系人建立高效的工作关系&#xff1b;②干系人认同项目目标&#xff1b;③支持项目的干系人提高了满意度&#xff0c;并从中收益&#xff1b;④反对项目的干系人没有对项目产生负面影响。问…

黑莓加大裁员力度,目标年利润再增1亿美元

近日&#xff0c;加拿大黑莓公司表示&#xff0c;今年的年利润再度增加 1 亿美元&#xff0c;为此将采取包括裁员在内的一系列降本措施。黑莓方面称&#xff0c;公司将在本季度进一步降低成本&#xff0c;并在网络安全业务上进行额外裁员&#xff0c;从而每年为公司节省约 2700…

MyBatis终版

MyBatis常见面试题汇总&#xff08;超详细回答&#xff09; 1.什么是Mybatis&#xff1f; Mybatis是一种流行的Java对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它将Java对象映射到关系型数据库中的表格。它提供了一种简单的方式来编写SQL语句并将其映射到Java对…

加了AI的旗舰版,会用就是好工具!

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; ACDSee Photo Studio Ultimate 2024是一款功能强大的数字图像预览和编辑软件&#xff0c;适用于专业的图像处理需求。它配备了高效的RAW编辑器&#…

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客&#xff0c;函数式编程 一.条件变量 1.概念 C条件变量&#xff08;condition variable&#xff09;是一种多线程编程中常用的同步机制&#xff0c;用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…

数据脱敏(四)脱敏算法-替换算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "替换脱敏"是一种数据处理技术&#xff0c;主要用于保护个人隐私和数据安全。它通过将敏感信息&#xff08;如姓名、身份证号、电话号码等&#xff09;替换为无意义或随机的字符&#xf…

hal/SurfaceFlinger/perfetto实战需求问题探讨作业-千里马framework开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 在新课halperfettosurfaceflinger https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg 推出后&#xff0c;各位学员朋友们都积极响应&#xff0c;开始马不停蹄的学习&#xff0c;学员学习后希望有更多的实战案例或者项目拿来练手&…

vue3中基于路由层面和组件层面进行用户角色及权限控制的方法解析

文章目录 一、权限控制二、路由层面控制三、组件层面控制1、使用自定义指令2、使用方法控制3、封装一个权限控制组件来实现组件层面控制权限3.1、组件页面 Authority.vue3.2、使用页面 app.vue3.3、效果预览 一、权限控制 随着前端技术的不断发展&#xff0c;越来越多的前端框…