1.介绍

二叉排序树(binary search tree简称BST)就是左子树所有结点小于根节点右子树所有结点大于根节点,且结点保存的数据不同的二叉树。

如下图:

2.操作

(1)查找

如果查找的值小于当前结点的值,就到该节点的左子树去找。

如果大于,就到当前节点的右子树去找。如果等于则返回。

template<typename T>
typename BsTree<T>::node* BsTree<T>::search1(const T& obj)
{
	node* p = root;
	while (p && p->data != obj)
	{
		if (obj < p->data)
			p = p->left;
		if (obj > p->data)
			p = p->right;
	}
	return p;
}
template<typename T>
typename BsTree<T>::node* BsTree<T>::search2(const T& obj,node* current)
{
	if (!current)
		return current;
	if (obj < current->data)
		return search2(current->left);
	else if (obj > current->data)
		return search2(current->right);
	else return current;
}

递归的函数更好,因为不需要递归所需的栈空间。

(2)插入

如果插入值小于当前结点的值,就到结点的左子树去插入。

如果插入值大于当前结点的值,就到结点的右子树去插入。

直到当前指针指是空指针,开始插入。

template<typename T>
void BsTree<T>::insert1(const T& temp)
{
	node* p = root;
	while (p)
	{
		if (temp < p->data)
			p = p->left;
		else if (temp > p->data)
			p = p->right;
		else throw("error");
	}
	p = new node(temp);
}
template<typename T>
void BsTree<T>::insert2(const T& temp, node* current)
{
	if (!current)
	{
		current = new node(temp);
	}
	if (temp < current->data)
		insert2(temp, current->left);
	else if (temp > current->data)
		insert2(temp, current->right);
	else throw("error");
}

(3)删除

删除当前结点,我们需要对删除后的树进行整合,保持二叉排序树的结构。

因此,我们需要原来结点下的一个结点来代替原来结点。

那么我们怎么选择结点才能保持二叉搜索树的结构呢?

1.选择左子树最大的结点来代替删除的结点。

2.选择右子树最小的结点来代替删除的结点。

3.如果左右子树没有结点则不做处理,直接删除。

但要注意一点:要修改删除结点的父节点指针。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐