二叉搜索树(BST)

定义

二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:

  1. 非空左子树的所有键值小于其根节点的键值。
  2. 非空右子树的所有键值大于其根结点的键值。
  3. 左、右子树都是二叉搜索树。

操作
  • 查找元素X
  • 找最大值max,最小值min
  • 插入元素X
  • 删除元素X
/*   二叉搜索树结点定义  */
typedef struct node* bst;
struct node 
{
	int data;
	bst left;
	bst right;
};
  1. 查找元素X(非递归)
bst Find(int x, bst t)
{
	while(t)
	{
		if(x > t->data) t = t->right;//往右边移动去找
		else if(x < t->data) t = t->left;//往左边移动去找
		else return t;//找到了,返回地址
	}
	return NULL;//没有找到
}
  1. 找最大值 、最小值(非递归)
    最大值一定在树的最右边,最小值一定在树的最左边
bst Findmin(bst t)
{
	if(t)
		while(t->left) t = t->left;
	return t;
}

bst Findmax(bst t)
{
	if(t)
		while(t->right) t = t->right;
	return t;
}
  1. 插入元素X
bst Insert(int x, bst t)
{
	if(!t)//如果是空的,就说明找到了插入位置
	{
		t = (bst)malloc(sizeof(struct node));
		t->data = x;
		t->left = t->right = NULL;
	}
	else 
	{
		if(x < t->data)//比它小,就去左边插入
			t->left = Insert( x, t->left);
		else if(x > t->data)//比它大,就去右边插入
			t->right = Insert( x, t->right);
	}
	return t;
}

在这里插入图片描述
如上图:比如要插入的是1,此时1应该往3的左边插入,所以3的左儿子的地址就等于下一次递归所生成结点的地址,而这个结点的data就等于被插入元素的值1。

4.删除元素X

考虑三种情况:

  • 要删除的是叶节点:直接删除,并修改其父节点指针,置为NULL
    在这里插入图片描述
  • 要删除结点只有一个孩子结点:将其父节点的指针指向被删除结点的孩子节点
    在这里插入图片描述
  • 要删除的结点有两个孩子结点:用右子树的最小元素或者左子树的最大元素代替被删除元素(因为这样可以保证子树仍然是BST的结构)
    在这里插入图片描述
bst Delete(int x, bst t)
{
	bst temp;
	if(!t) printf("要删除元素未找到!\n");
	//首先是一个查找过程
	else if(x < t->data)
		t->left = Delete( x, t->left);
	else if(x > t->data)
		t->right = Delete( x, t->right);
	else//找到了
		if(t->left && t->right)//有两个孩子节点
		{
			temp = Findmin(t->right);
			t->data = temp->data;
			t->right = Delete( t->data, t->right);//去右边删除最小元素
		}
		else//只有一个孩子结点或者没有
		{	
			temp = t;
			if(!t->left)//有右孩子或者无孩子
				t = t->right;//把指向它的指针置为指向它的右儿子或空
			else if(!t->right)//有左孩子或者无孩子
				t = t->left;//把指向它的指针置为指向它的左儿子或空
			free(temp);
		}
	return t;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值