【C++】实现一个二叉搜索树

news2024/11/19 15:20:20

 


目录

二叉搜索树的概念

1.结点定义

2.构造、析构、拷贝构造、赋值重载

3.插入、删除、查找、排序

3.1插入

3.2插入递归版

3.3查找指定值

3.3查找指定值递归版

3.4中序遍历

3.5删除

最后


二叉搜索树的概念

二叉搜索树又称为二叉排序树或二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 非空左子树上所有结点的值都小于根结点的值。
  • 非空右子树上所有结点的值都大于根结点的值。
  • 左右子树都是二叉搜索树。

1.结点定义

template<class K>
struct BSTreeNode
{
	BSTreeNode<K>* _left;
	BSTreeNode<K>* _right;
	K _key;

	BSTreeNode(const K& key)
		:_key(key)
		,_left(nullptr)
		,_right(nullptr)
	{}
};

2.构造、析构、拷贝构造、赋值重载

    //构造函数
	BSTree()
		: _root(nullptr)
	{

	}

	//析构函数
	~BSTree()
	{
		//递归删除
		Destroy(_root);
		_root = nullptr;
	}

	
	//拷贝构造
	BSTree(const BSTree<K>& t)
	{
	     //递归去拷贝
		_root = Copy(t._root);
		
	}

	//赋值重载
	BSTree<K>& operator=(BSTree<K> t)//注意这里传参,传值传参,默认已经拷贝构造新的一份了
	{
		swap(_root, t._root);//这里直接交换return 就好
		return *this;
	}
	  

	Node* Copy(Node* root)
	{
		//前序遍历
		if (root == nullptr)
		{
			return nullptr;
		}

		Node* newRoot = new Node(root->_key);
		//建立联系,不是简单的调用
		newRoot->_left = Copy(root->_left);
		newRoot->_right = Copy(root->_right);
		return newRoot;
	}
   
    void Destroy(Node* root)
	{
		if (root == nullptr)
		{
			return;
		}
		Destroy(_root->_left);
		Destroy(_root->_right);
		delete(root);
	}

3.插入、删除、查找、排序

3.1插入

bool Insert(const K& key)
	{
		//不允许相等数据插入版本,减少冗余
		//空树
		if (_root == nullptr)
		{
			_root = new Node(key);
			return true;
		}
 
		//正常插入
		Node* cur = _root;
		Node* parent = _root;
		while (cur != nullptr)
		{
			if (key > cur->_key)
			{
				parent = cur;
				cur = cur->_right;
			}
			else if (key < cur->_key)
			{
				parent = cur;
				cur = cur->_left;
			}
			else
			{
				return false;
			}
		}
		cur = new Node(key);
		if (key > parent->_key)
		{
			parent->_right = cur;
		}
		else
		{
			parent->_left = cur;
		}
		return true;

	}

3.2插入递归版

bool InsertR(const K& key)//注意参数
	{
		return _InsertR(_root, key);
	}
bool _InsertR(Node* &root,const K& key)
	{
		if (root == nullptr)
		{
			root = new Node(key);
			return true;
		}
		if (root->_key > key)
		{
			return _InsertR(root->_left, key);
		}
		else if (root->_key < key)
		{
			return _InsertR(root->_right, key);

		}
		else
		{
			//相等
			return false;
		}
		
	}

3.3查找指定值

bool Find(const K& key)
	{
		Node* cur = _root;
		while (cur!=nullptr)
		{
			if (cur->_key > key)
			{
				cur = cur->_left;
			}
			else if (cur->_key < key)
			{
				cur = cur->_right;
			}
			else
			{
				return true;
			}
		}
		return false;
	}

3.3查找指定值递归版

    bool FindR(const K& key)
	{
		return _FindR(_root, key);
	}
    
    bool _FindR(Node*& root, const K& key)
	{
		if (root == nullptr)
		{
			return false;
		}

		if (root->_key == key)
		{
			return true;
		}

		if (root->_key > key)
		{
			return _FindR(root->_left, key);
		}
		else 
		{
			return _FindR(root->_right, key);

		}
		
		
	}

3.4中序遍历

    void InOrder()
	{
		_InOrder(_root);
	}
    void _InOrder(Node* root)
	{
		if (root == nullptr)
		{
			return;
		}
		_InOrder(root->_left);
		cout << root->_key << " ";
		_InOrder(root->_right);
	}

3.5删除

bool Erase(const K& key)
	{
		Node* cur = _root;
		Node* parent = _root;
		while (cur)
		{
			//找到节点
			if (cur->_key > key)
			{
				parent = cur;
				cur = cur->_left;
			}
			else if (cur->_key < key)
			{
				parent = cur;
				cur = cur->_right;
			}
			else
			{
				//找到了
				//删除没有孩子或者只有一种孩子的节点

				//这个是普通节点
				if (cur->_right == nullptr)
				{
					if (parent->_left == cur)
					{
						parent->_left = cur->_left;
					}
					if (parent->_right == cur)
					{
						parent->_right = cur->_left;
					}
				    if(parent==cur)//是根结点
					{
						parent = parent->_left;
					}
					delete(cur);
					return true;
					
				}
				else if(cur->_left==nullptr)
				{
					if (parent->_left == cur)
					{
						parent->_left = cur->_right;
					}
					if (parent->_right == cur)
					{
						parent->_right = cur->_right;
					}
					if (parent == cur)//是根结点
					{
						parent = parent->_right;
					}
					delete(cur);
					return true;

				}
				else
				{
					//左右都不为空
				    //替换法删除,找右子树的最小值
					Node* miniright = cur->_right;
					Node* minirightp = cur;

					while (miniright->_left != nullptr)
					{
						minirightp = miniright;
						miniright = miniright->_left;
					}
					cur->_key = miniright->_key;
					if (minirightp->_left == miniright)
					{
						minirightp->_left = miniright->_right;
					}
					if (minirightp->_right == miniright)
					{
						minirightp->_right = miniright->_right;
					}
					delete(miniright);
					return true;

				}
				

			}
		}
		return false;

	}


最后

加油

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

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

相关文章

python WEB接口自动化测试之requests库详解

由于web接口自动化测试需要用到python的第三方库--requests库&#xff0c;运用requests库可以模拟发送http请求&#xff0c;再结合unittest测试框架&#xff0c;就能完成web接口自动化测试。 所以笔者今天先来总结一下requests库的用法。希望对大家&#xff08;尤其是新手&…

使用CICFlowMeter 实现对pcap文件的特征提取【教程】

使用CICFlowMeter 实现对pcap文件的特征提取【教程】 针对现有的关于CICFlowMeter 的使用教程不够全面&#xff0c;一些细节没有展示&#xff0c;我将结合网络上的相关资料和实际的经历&#xff0c;提供一些经验和建议。 configuration information --------------- Windows…

hexo部署到gitee(码云)

引言 Hexo 是一个基于Node.js的静态博客框架&#xff0c;而 Gitee&#xff08;也被称为码云&#xff09;是一个国内的代码托管平台&#xff0c;支持 Git 版本控制系统&#xff0c;与 GitHub 类似。将 Hexo 部署到 Gitee Pages 可以让你的博客受益于 Gitee 的国内服务器&#xf…

详解计算机软件基本概念

软件基本概念 软件的定义 一个完整的计算机系统是由硬件系统和软件系统协同工作来完成某一给定的任务的。 只有硬件的计算机称为裸机&#xff0c;裸机必须安装了计算机软件后才可以完成各项任务。 从广义地讲&#xff0c;软件是指计算机程序、数据以及开发、使用和维护程序…

Go语言安全编码:crypto/sha1库全面解析

Go语言安全编码&#xff1a;crypto/sha1库全面解析 简介SHA-1基础原理和特点SHA-1与其他哈希算法的比较代码示例&#xff1a;基本的SHA-1哈希生成 使用crypto/sha1处理数据处理字符串和文件的SHA-1哈希代码示例&#xff1a;为文件生成SHA-1哈希 常见错误和最佳实践 在实际项目中…

烟雨要饭网带后台,附带搭建教程

直接上传访问即可&#xff0c;有安装向导&#xff0c;php环境不得低于7.0 后台地址/Admin&#xff0c;默认账号admin 默认密码123456 自带乞讨音乐&#xff0c;增加樱花特效

《乱弹篇(十二)聊春晚》

龙年大初一&#xff0c;老龄笔者发表《乱弹篇&#xff08;十二&#xff09;》。“十二”的标志&#xff0c;乃好事成双“二”。喜庆有余&#xff0c;自不待言&#xff01; 除夕夜我没有看春晚&#xff0c;是在继续追剧&#xff0c;即以明朝宫廷内斗为背景的电视连续剧《后宫》…

【原理图PCB专题】Cadence17.4版本新增加的Cutout和Design_Outline层有什么用?

在Cadence 17.4版本中我们发现在Board Geometry下面多出了Cutout和Design_Outline两层,其实这两层在高版本的软件中都做为板框使用。 如下所示在输出光绘时,如果没有将Cutout和Desing_Outline两层加入,还是使用16版本的Outline来定义板框的话,在出光绘时会提示:WA…

备战蓝桥杯---搜索(进阶1)

话不多说&#xff0c;直接看题&#xff1a; 没有传送带时&#xff0c;我们可以直接BFS&#xff0c;但因为传送带的出现&#xff0c;可能在队列里的元素到起点时间不单调的问题&#xff0c;而BFS本来就是可以看成随着时间推移而产生的情况&#xff0c;于是我们把队列看成优先队列…

Matlab使用点云工具箱进行点云配准ICP\NDT\CPD

一、代码 主代码main.m&#xff0c;三种配准方法任选其一 % 读取点云文件 source_pc pcread(bun_zipper.ply); target_pc pcread(bun_zipper2.ply);% 下采样 ptCloudA point_downsample(source_pc); ptCloudB point_downsample(target_pc);% 配准参数设置 opt param_set…

有关网络安全的课程学习网页

1.思科网络学院 免费学习skillsforall的课程 课程链接&#xff1a;Introduction to Cybersecurity by Cisco: Free Online Course (skillsforall.com) 2.斯坦福大学计算机和网络安全基础 该证书对于初学者来说最有价值&#xff0c;它由最著名的大学之一斯坦福大学提供。您可…

卫星通讯领域FPGA关注技术:算法和图像方面(1)

最近关注的公众号提到了从事移动通信、卫星通讯等领域的FPGA、ASIC、信号处理算法等工程师可能需要关注的技术&#xff0c;有LMS算法、RLS算法、LCMV算法、SAR图像处理&#xff0c;以下做了一些基础的调研&#xff1a; 1 LMS算法&#xff1a; LMS&#xff08;Least Mean Squa…

springboot170图书电子商务网站的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

elasticsearch下载及可视化工具下载使用

elasticsearch下载及配置、启动 一、下载 Download Elasticsearch | Elastic 二、启动 双击bat即可。 出现如下说明启动成功&#xff1a; 访问测试&#xff1a; 三、注意 &#xff08;1&#xff09;因为es启动默认端口是&#xff1a;9200,所以需要检查此端口是否被占用。…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

【万题详解】洛谷P1282 多米诺骨牌

题目 链接——题目在这里&#xff01;&#xff01;&#xff01; 多米诺骨牌由上下 22 个方块组成&#xff0c;每个方块中有 1∼6 个点。现有排成行的上方块中点数之和记为 S1​&#xff0c;下方块中点数之和记为 S2​&#xff0c;它们的差为 ∣∣S1​−S2​。如图S161119&…

最佳视频转换器软件:2024年视频格式转换的选择

我们生活在一个充满数字视频的世界&#xff0c;但提供的内容远不止您最喜欢的流媒体服务目录。虽然我们深受喜爱的设备在播放各种自制和下载的视频文件方面变得越来越好&#xff0c;但在很多情况下您都需要从一种格式转换为另一种格式。 经过大量测试&#xff0c; 我们尝试过…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

【MySQL】数据库基础 -- 详解

一、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能&#xff0c;但是文件并没有提供非常好的数据&#xff08;内容&#xff09;的管理能力&#xff08;用户角度&#xff09;。 文件保存数据有以下几个缺点&…

《MySQL 简易速速上手小册》第8章:事务管理和锁定策略(2024 最新版)

文章目录 8.1 理解 MySQL 中的事务8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 Python 实现银行转账事务8.1.3 拓展案例 1&#xff1a;处理并发事务8.1.4 拓展案例 2&#xff1a;使用 Python 监控事务状态 8.2 锁定机制和事务隔离级别8.2.1 基础知识讲解8.2.2 重点案例&…