【 C++ 】搜索二叉树


今天介绍一种新的树形结构--搜索二叉树,它是这样定义的。任意节点的左子树小于根小于右子树。注意是所有值,也就是左子树的最大值也小于根,同理,右子树的最小值也大于根。

实现起来也很简单,主要有增删查等功能,注意没有改。我们实现两个版本,一种是只存储一个值_key,一种是存储两个值_key_value。这就是以后会学的set和map雏形。

增加值

如果有一模一样的值默认是不加入的,当然你可以自己调整代码逻辑,我这里是默认不加入。代码很简单,写一个父节点用于追踪,写一个子节点。注意当没有根节点时,直接new根节点然后return true即可,其他情况需要分类讨论。

查找

查找逻辑类似,也非常简单,自己实现即可。

删除

删除逻辑略有些麻烦,需要分类讨论,第一种情况是左右节点都没有,直接delete即可,二三情况就是没有左节点或没有右节点,第一种情况可以并入二三情况。第四种情况就是左右节点都有,直接删除肯定是不行的,所以我们采用替代法,找一个不破坏搜索二叉树定义的值和目标值替换。有两种替换方法,一种是找左子树的最大值,一种是找右子树的最小值。也很简单,一个while循环就搞定了。这里简单列一下核心代码。

cpp 复制代码
if (cur->leftNode == nullptr)
{
				if (cur == _root)
				{
					_root = cur->rightNode;
				}
				else
				{
					if (curParent->leftNode == cur)
						curParent->leftNode = cur->rightNode;
					else
						curParent->rightNode = cur->rightNode;
				}

				delete cur;
}

else if (cur->rightNode == nullptr)
{
				if (cur == _root)
				{
					_root = cur->rightNode;
				}
				else
				{
					if (curParent->leftNode == cur)
						curParent->leftNode = cur->leftNode;
					else
						curParent->rightNode = cur->leftNode;
				}

				delete cur;
}

else
{
				Node* replaceParent = cur;
				Node* replace = cur->rightNode;
				while (replace->leftNode)
				{
					replaceParent = cur;
					replace = replace->leftNode;
				}
				cur->_key = replace->_key;

				if (replaceParent->_left == replace)
					replaceParent->_left = replace->_right;
				else
					replaceParent->_right = replace->_right;

				delete replace;
				
}
return true;

整体来说搜索二叉树就是一个过渡的知识点,可以自己实现一下,检验一下自己c++类和对象以及模版的学习成果。

相关推荐
Ivanqhz3 分钟前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
kakakahahahaha7 分钟前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i12 分钟前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
by2099933 分钟前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
沙漠之主34 分钟前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i44 分钟前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
FPGA小徐1 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
笨笨饿1 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
Godspeed Zhao1 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
YOLO数据集集合1 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化