数据结构——二叉排序树

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.如果左右子树没有结点则不做处理,直接删除。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值