C++高级数据结构 | 二叉搜索树BST --- (Binary Search Tree)

本文详细介绍了二叉搜索树(BST)的概念、构造、遍历(包括中序遍历)、查找、插入、删除操作,以及如何计算树的高度和节点数。通过实例展示了BST的特性及其C++实现。
摘要由CSDN通过智能技术生成

什么是BST

BST树(Binary Search Tree)二叉搜索树

其性质如下:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉查找树。
如下图所示:
在这里插入图片描述

BST的构造

// 定义BST树节点的类型
	struct BSTNode
	{
   
		BSTNode(T data = T())
			:_data(data)
			, _left(nullptr)
			, _right(nullptr)
		{
   }
		T _data;
		BSTNode *_left;
		BSTNode *_right;
	};
	BSTNode *_root; // 指向树的根节点

BST的遍历和排序(中序遍历即可)

对于已知的二叉查找树的从小到大排序就是他的中序遍历顺序
即从根节点开始,若有左子树则递归输出左子树直到叶子结点,再输出自身,再递归输出右子树。
如图所示:
在这里插入图片描述
如图:
前序遍历:45->20->10->35->31->25->37->56->49->51->60
中序遍历:10->20->25->31->35->37->45->49->51->56->60
后序遍历:10->25->31->37->35->20->51->49->60->56->45

代码如下:

public:
	void Pre_out()
	{
   
		Pre_out(_root);
		cout << endl;
	}
	void Mid_out()
	{
   
		Mid_out(_root);
		cout << endl;
	}
	void Last_out()
	{
   
		Last_out(_root);
		cout << endl;
	}
private:
void Pre_out(BSTNode *node)	//前序遍历
	{
   
		if (node != nullptr)
		{
   
			cout << node->_data << " ";
			Pre_out(node->_left);
			Pre_out(node->_right);
		}
	}
	void Mid_out(BSTNode *node)	//中序遍历
	{
   
		if (node != nullptr)
		{
   
			Mid_out(node->_left);
			cout << node->_data << " ";
			Mid_out(node->_right);
		}
	}
	void Last_out(BSTNode *node)	//后序遍历
	{
   
		if (node != nullptr)
		{
   
			Last_out(node->_left);
			Last_out(node->_right);
			cout << node->_data << " ";
		}
	}

BST的查找

在已存在的BST中查找值为value的结点
思路:
从根结点开始查找
如果要查的值value等于当前节点的值,则返回true。
如果要查的值value小于当前节点的值,则在当前节点的左子树中查找;
如果要查的值value大于当前节点的值,则在当前节点的右子树中查找;
如果查完没有找到一个结点的值为value则返回false,否则返回true。

bool query(const T &val)	//实现BST树查找指定的元素值val是否存在
	{
   
		if (_root == nullptr)	//判断树是否存在
		{
   
			return false;
		}
		BSTNode*ptmp = _root;
		while (ptmp != nullptr&&ptmp->_data != val)	//若ptmp为空则已经遍历完整个树了
		{
   
			if (val < ptmp->_data)
			{
   
				ptmp = ptmp->_left;
			}
			if (val > ptmp->_data)
			{
   
				ptmp = ptmp->_right;
			}
		}
		//退出的while循环的条件有两个
		//一个是搜索完了整个树,没有找到一个结点的值为val
		if (ptmp == nullptr)
		{
   
			return false;
		}
		//另外一个是找到了
		return true;
	}

BST的插入

思路:
从根节点开始插入
如果要插入的值value小于等于当前节点的值,则在当前节点的左子树中插入;
如果要插入的值value大于当前节点的值,在当前节点的右子树中插入;
如果节点为空节点,则找到该结点的父结点在此建立新的结点并判断是父结点的左孩子还是右孩子

//非递归实现BST树的插入操作
	void noninsert(const T &val)
	{
   
		if (_root == nullptr)	//判断树是否存在
		{
   
			_root = new BSTNode(val);
			return;
		}
		BSTNode *pre = nullptr;		//插入点,用于最后一步的插入
		BSTNode *tmp = _root;		//用于寻找插入点
		while (tmp != nullptr)
		{
   
			pre = tmp;		//实时更新插入点的父结点
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值