二叉搜索树--BinarySerachTree(BSTree)

本文介绍了二叉搜索树(BSTree)的概念、特性,并详细讲解了非递归和递归方式的插入、删除操作,以及二叉树的中序遍历。此外,还探讨了二叉搜索树的KVAl模型及其优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

🎇二叉搜索树

🎆二叉搜索树概念

✨character:

🎇二叉树的实现

🎆二叉树的创建

🎆二叉树的插入~(非递归)

🎆中序遍历

🎆删除(非递归)~

🎆exception: 

🎆Recursion edition

✨递归插入

✨递归删除

🎆二叉树的KVAl模型

✨kval模型介绍

✨Kval全码实现~


csdn主页

🎇二叉搜索树

🎆二叉搜索树概念

我们知道树是非线性结构的,但是在二叉树知识中我们可以创建某种类型的树,对它进行~增~删·~查~改。Such as BInarySerachTree我们叫它二叉搜索树,一般及简写为BSTree。

✨character:

  • 若它的 左子树不为空,则左树上的所有节点的值都小于根节点的值~
  • 若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值·~
  • 它的左右子树也分别二叉搜索树~

这个树长这个样子👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

我们可以通过这张图观察到它的性质·~~~

这么一颗神奇的树是怎么是实现的呢~~我们通过代码了解一下👇👇👇👇👇👇👇👇👇👇👇

🎇二叉树的实现

🎆二叉树的创建

//树的左右节点,以及节点的值~~
template <class T>
struct BinarySerachTree
{
public:
	BinarySerachTree(const T& val)
		:right(nullptr)
		, left(nullptr)
		, _val(val)
	{}
	BinarySerachTree<T>* left;
	BinarySerachTree<T>* right;
	T _val;
};


//树的根,我们也给他一个类型,方便写函数~~
template<class T>
struct BinaryTreeRoot
{
public:
	typedef BinarySerachTree<T> Node;
	BinaryTreeRoot()
		:_root(nullptr)
	{}
private:
Node*_root;
}

以上二叉树就简单的创建好了~~我们试着往里面插入一些数据吧👇👇👇👇👇👇👇👇👇👇

🎆二叉树的插入~(非递归)

我们在插入直线需要考虑两种情况

  • case:1  树为空的话我们直接进行插入~~
  • case:2  树不为空,进行遍历,查找左右子树~  

树为空:

bool Insert(const T& val)
	{
       //树为空直接进行插入,然后返回~~
		if (!_root)
		{
			_root = new Node(val);
			return true;
		}

    }
int main()
{
BinaryTreeRoot<int> root;
	int arr[] = {5,3,4,1,7,8,2,6,0,9};
	for (auto e : arr)
	{
		root.Insert(e);
	}
}



树不为空:

     我们要插入4这个节点~~具体操作就是首先遍历根->左节点or右节点->找到了就new一个新节点出来然后进行插入👇👇👇👇👇👇👇👇👇👇👇👇👇👇

bool Insert(const T& val)
	{
		if (!_root)
		{
			_root = new Node(val);
			return true;
		}
        //创建临时变量来遍历这个树·~~再遍历树的同时我们还需要记录要插入
        //节点父亲的位置,来进行链接
		Node* cur = _root;
		Node* parent = nullptr;
        //cur为空时就说明找到了合适的插入位置~~
		while (cur)
		{
			if (val > cur->_val)
			{
				parent = cur;
				cur = cur->right;
			}
			else if(val<cur->_val)
			{
				parent = cur;
				cur = cur->left;
			}
			else
			{
				return false;
			}
		}
        //让cur=new出来的新节点,我们需要注意的是要插入的数据大于还是
        //小于父亲节点,然后决定放在左边还是右边~~
	    cur = new Node(val);
		if (val > parent->_val)
		{
			parent->right = cur;
		}
		else
		{
			parent->left = cur;
		}
		return true;
	}

🎆中序遍历

    中序遍历可以让这棵树以有序的序列进行打印~~

void _Inorder(Node*root)
	{
		if (!root)
		{
			return;
		}
		
		_Inorder(root->left);
		cout << root->_val << " ";
		_Inorder(root->right);
		
	}
	void Inorder()
	{
		_Inorder(_root);
		cout << endl;
	}

我们之所以是要用两个函数来实现是因为,我们从外面不容易直接访问成员变量,所以定义一个子函数来进行中序遍历~~~Look👇ὄ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值