
✨前言✨
🎓作者:【 教主 】
📜文章推荐:
☕博主水平有限,如有错误,恳请斧正。
📌机会总是留给有准备的人,越努力,越幸运!
💦导航助手💦
概念
接口实现
节点定义
插入元素
删除元素
查找元素
概念
二叉搜索树又称为二叉排序树,有以下几个特征
- 左子树的值都比根节点的值小
 - 右子树的值都比根节点的值大
 - 左右子树也是二叉搜索树
 - 中序遍历是升序
 - 一般不支持改变元素
 

接口实现
注意:以下为C++模板实现
节点定义
template<class K>
struct BSTreeNode
{
	BSTreeNode(const K& val = val())
	{
		_left = nullptr;
		_right = nullptr;
		_val = val;
	}
	BSTreeNode* _left;
	BSTreeNode* _right;
	K _val;
}; 
插入元素
非递归版本
bool Insert(const K& val)
		{
			if (_root == nullptr)
			{
				_root = new Node(val);
				return true;
			}
			Node* cur = _root;
			Node* parent = nullptr;
			while (cur)
			{
				if (val > cur->_val)
				{
					parent = cur;
					cur = cur->_right;
				}
				else if (val < cur->_val)
				{
					parent = cur;
					cur = cur->_left;
				}
				else
				{
					return false;
				}
			}
			Node* newNode = new Node(val);
			if (val > parent->_val)
				parent->_right = newNode;
			else
				parent->_left = newNode;
			return true;
		} 
递归版本
InsertR()函数为公有,_InesertR()函数为私有 ,调用时直接调用InsertR()即可。
bool InsertR(const K& val)
		{
			return _InsertR(_root, val);
		}
bool _InsertR(Node*& root, const K& val)
		{
			if (root == nullptr)
			{
				root = new Node(val);
				return true;
			}
			if (val > root->_val)
				return _InsertR(root->_right, val);
			else if (val < root->_val)
				return _InsertR(root->_left, val);
			else
				return false;
		} 
删除元素
非递归版本
bool Erase(const K& val)
		{
			Node* cur = _root;
			Node* parent = nullptr;
			while (cur)
			{
				if (val > cur->_val)
				{
					parent = cur;
					cur = cur->_right;
				}
				else if (val < cur->_val)
				{
					parent = cur;
					cur = cur->_left;
				}
				else
				{
					if (cur == _root)
					{
						if (cur->_left == nullptr)
						{
							_root = _root->_right;
							delete cur;
							cur = nullptr;
							return true;
						}
						else if (cur->_right == nullptr)
						{
							_root = _root->_left;
							delete cur;
							cur = nullptr;
							return true;
						}
						else
						{
							Node* min = cur->_right;
							Node* minParent = cur;
							while (min->_left)
							{
								minParent = min;
								min = min->_left;
							}
							if (minParent == cur)
							{
								std::swap(minParent->_val, min->_val);
								minParent->_right = min->_right;
								delete min;
								min = nullptr;
								return true;
							}
							else
							{
								std::swap(cur->_val, min->_val);
								minParent->_left = min->_right;
								delete min;
								min = nullptr;
								return true;
							}
						}
					}
					else
					{
						if (cur->_left == nullptr)
						{
							if (parent->_left == cur)
								parent->_left = cur->_right;
							else
								parent->_right = cur->_right;
						}
						else if (cur->_right == nullptr)
						{
							if (parent->_left == cur)
								parent->_left = cur->_left;
							else
								parent->_right = cur->_left;
						}
						else
						{
							Node* min = cur->_right;
							Node* minParent = cur;
							while (min->_left)
							{
								minParent = min;
								min = min->_left;
							}
							if (minParent == cur)
							{
								std::swap(minParent->_val, min->_val);
								minParent->_right = min->_right;
								delete min;
								min = nullptr;
								return true;
							}
							else
							{
								std::swap(cur->_val, min->_val);
								minParent->_left = min->_right;
								delete min;
								min = nullptr;
								return true;
							}
						}
					}
					return true;
				}
			}
		} 
递归版本
EraseR()为公有,_EraseR()为私有,调用时直接调用Erase()即可。
bool EraseR(const K& val)
		{
			return _EraseR(_root, val);
		}
bool _EraseR(Node*& root, const K& val)
		{
			if (root == nullptr)
				return false;
			if (val > root->_val)
			{
				return _EraseR(root->_right, val);
			}
			else if (val < root->_val)
			{
				return _EraseR(root->_left, val);
			}
			else
			{
				Node* del = root;
				if (root->_left == nullptr)
				{
					root = root->_right;
					delete del;
					del = nullptr;
					return true;
				}
				else if (root->_right == nullptr)
				{
					root = root->_left;
					delete del;
					del = nullptr;
					return true;
				}
				else
				{
					Node* min = root->_right;
					Node* minParent = root;
					while (min->_left)
					{
						minParent = min;
						min = min->_left;
					}
					if (minParent == root)
					{
						std::swap(root->_val, min->_val);
						minParent->_right = min->_right;
						delete min;
						min = nullptr;
						return true;
					}
					std::swap(root->_val, min->_val);
					return _EraseR(root->_right, val);
				}
				
			}
		} 
查找元素
非递归版本
Node* Find(const K& val)
		{
			Node* cur = _root;
			while (cur)
			{
				if (val > cur->_val)
					cur = cur->_right;
				else if (val < cur->_val)
					cur = cur->_left;
				else
					return cur;
			}
			return nullptr;
		} 
递归版本
FindR()为公有,_FindR()为私有,调用时直接调用FindR()即可。
Node* FindR(const K& val)
		{
			return _FindR(_root, val);
		}
Node* _FindR(Node*& root, const K& val)
		{
			if (root == nullptr)
				return nullptr;
			if (val > root->_val)
				return _FindR(root->_right, val);
			else if (val < root->_val)
				return _FindR(root->_left, val);
			else
				return root;
		} 
 
欢迎关注,码字不易,希望多多点赞、收藏哦!抱拳了。
















![[极客大挑战 2019]BuyFlag1(BUUCTF)](https://img-blog.csdnimg.cn/e4c32cee534e4932816d3ba0912fcc53.png)


