C++ 渗透 数据结构中的二叉搜索树

欢迎来到干货小仓库

"沙漠尽头必是绿洲。"

--面对技术难题时,坚持终会看到希望。

1.二叉搜索树的概念

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

a、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。

b、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。

c、它的左右子树也分别为二叉搜索树

2.二叉搜索树的查找

①从根开始比较,若查找的目标值比根大则往右子树中查找,比根小则往左边找。

②最多查找高度次,走到空还没找到,则这个值不存在。

循坏实现和递归实现

3.二叉搜索树的插入

a、若树为空,则直接新增节点,赋值给根(root)。

b、树不为空,则按二叉搜索树的规则走,比根节点大的 往右子树找,反之往左子树找,找到插入位置后,与该位置的父节点比较,看链接在左子树还是右子树。

c、当插入的数据,树中已有则插入失败。

4.二叉搜索树的删除

首先遍历二叉搜索树,看是否存在删除的值,不存在则直接返回false。

存在:主要分为两种情况

①该节点其左子树/右子树其中一个不为空或者都为空

②该节点其左子树和右子树都不为空。

第一种情况

第二种情况:要删除的节点的左右子树都不为空

方式一:与左子树的最右节点交换(左子树最大值)

方式二:与右子树的最左节点交换(右子树最小值)

非递归版本

cpp 复制代码
//非递归
bool Erase(const K& key)
{
	Node* cur = _root;
	Node* parent = nullptr;
	while (cur)
	{
		if (cur->_key > key)
		{
			parent = cur;
			cur = cur->_left;
		}
		else if (cur->_key < key)
		{
			parent = cur;
			cur = cur->_right;
		}
		//找到删除元素了
		else
		{	//左子树为空
			if (cur->_left == nullptr)
			{	
				//要删除的数据是根节点
				if (cur == _root)
					_root = _root->_right;
				else
				{
					if (parent->_right == cur)
						parent->_right = cur->_right;

					else
						parent->_left = cur->_right;
				}
			}
			//右子树为空
			else if (cur->_right == nullptr)
			{	//要删除的数据是根节点
				if (cur == _root)
				{
					_root = _root->_left;
				}
				else
				{
					if (parent->_right == cur)
						parent->_right = cur->_left;
					else
						parent->_left = cur->_left;
				}
			}
			//左右都不为空
			else
			{
				//找左子树的最大值(其右子树必为空)
				parent = cur;
				Node* leftMax = cur->_left;
				while (leftMax->_right != nullptr)
				{
					parent = leftMax;
					leftMax = leftMax->_right;
				}
				swap(cur->_key, leftMax->_key);

				if (parent->_left == leftMax)
					parent->_left = leftMax->_left;
				else
					parent->_right = leftMax->_left;
				cur = leftMax;
			}
			delete cur;
			return true;
		}
	}
	return false;
}

递归版本


觉得不错的可以点赞+收藏+关注奥!!!谢谢大家的支持

相关推荐
草履虫建模15 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq17 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq18 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq18 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)19 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi19 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
CSDN_RTKLIB19 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++
不能隔夜的咖喱20 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头20 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头20 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机