二叉搜索树的基本操作和简单的应用

二叉搜索树

什么是二叉搜索树:二叉搜索树又称之为二叉排序树,它不为空树时,它左子树上所有的元素都小于根节点的元素,而根节点右子树上所有的元素都大于根节点的元素。

二叉搜索树的基本操作:

二叉树的查找:

思路  :

非递归查找:

         1.如果二叉树的根节点为空的话,直接返回0。

          2.如果二叉树的该根节点不为空的话,循环下面的操作:

          3 用要查找的元素与根节点的元素比较。如果要查找的元素大于根节点的元素的话,向根节点的右边查找.

          4 如果要查找的元素小于根节点的元素时,向根节点的最左边查找。

          5.如果要查找的元素等于根节点时,返回1。

如果循环结束时,代表此时没有找到该元素,直接返回0.

递归查找:

          1.如果根节点为空的话,直接返回0;

          2.如果根节点等于你要查找的元素时,返回1;

          3.如果根节点大于你要查找的元素时,递归向根节点的左子树查找。

          4.如果根节点小于你要查找的元素时,递归香根结点的右子树查找。

 如果上面的操作全部执行完之后代表二叉搜索树中没有该元素。

//寻找数据为data的元素,找到返回1,找不到返回0
int Find(FindTree *q, DataType data)
{
	FindTree *ret = q;
	//当树为空时,立即返回0
	if(q == NULL)
		return 0;
	while(q)
	{
		//如果找到的话,返回1;
		if(data == q->data)
			return 1;
		//如果要查找的数据大于根节点的数据,则向右查找
		else if(data > q->data)
		{
			q = q->right;
		}
		//如果要查找的数据小于根节点的数据,则向左查找
		else if(data < q->data)
		{
			q = q->left;
		}
	}
	//如果没有找到,返回0
	return 0;
}
//递归查找
int RecursionFindTree(FindTree *q, DataType data)
{
	//如果根节点为空的话,返回0
	if(q == NULL)
		return 0;
	//如果根节点的数据等于要查找的数据时,返回1;
	if(q->data == data)
		return 1;
	//如果根节点的数据大于要查找的数据时,向左子数查找
	if(q->data > data)
		return RecursionFindTree(q->left, data);
	//如果根节点的数据小于要查找的数据时,向右子树查找
	if(q->data < data)
		return RecursionFindTree(q->right, data);
	return 0;
}

二叉树的插入:

思路:

二叉搜索树插入的非递归的方法:

           1.如果树为空的话,直接插入该元素。

           2.如果树不为空的话,执行下面的操作:

                        a.设置两个指针child和parent,child用来查找要插入元素的插入的位置。parent指向child的双亲节点。

                       b.用child在二叉搜索树中循环查找要插入元素的位置,然后让parent指向child的双亲。如果在child的查找过程中发现有元素与你要插入的元素相同的话,直接返回0.不用插入。

                        c.判断要插入的位置在parent的左边还是右边。然后插入此元素。

二叉搜索树的递归插入:

             1.如果根节点为空时(代表此时二叉树可能是空树,也可能找到了要插入的位置),直接插入要插入的元素。

             2.如果根节点的元素等于你要插入的元素的话,代表此元素已经存在,直接返回0;

             3.如果根节点的元素大于你要插入的元素时,递归的向根节点的左子树查找。

             4.如果根节点的元素小于你要插入的元素时,递归的向根节点的右子树查找。

//创建一个节点
FindTree *BuyNode(DataType data)
{
	FindTree *ret = (FindTree *)malloc(sizeof(FindTree));
	if(ret == NULL)
	{
		assert(0);
	}
	ret->data = data;
	ret->left = NULL;
	ret->right = NULL;
	return ret;
}
//向二叉搜索树中插入元素data
int InsertTree(FindTree **q, DataType data)
{
	FindTree* cur = *q;//用来寻找要插入的位置
	FindTree* parent = NULL;//用来标记要插入位置的双亲节点
	//如果是空树的话,直接插入
	if(*q == NULL)
	{
		*q = BuyNode(data);
		return 1;
	}
	//如果不是空数的话,寻找该元素应该插入的位置
	while(cur != NULL)
	{
		//如果数据在二叉树中已经存在的话,直接返回,插入失败
		if((cur)->data == data)
			return 0;
		//如果要查的数据比根节点的数据小的话,向做查找,并用parent记录双亲节点
		else if(cur->data < data)
		{
			parent = cur;
			cur = cur->r
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值