二叉搜索树

文章介绍了二叉搜索树的基本定义和性质,包括其左子树所有节点值小于根节点,右子树所有节点值大于根节点。通过示例展示了如何将一组数字构建为二叉搜索树,并提供了初始化、插入数据和查找数据的C语言实现代码。二叉搜索树的优势在于快速查找,通过比较节点值可以迅速缩小搜索范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

它的本质上是一颗二叉树,只拥有俩个子结点

它的性质有以下几点:

1.若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。

2.若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。

3.它的左、右树又分为⼆叉排序树

那么接下来还是以图的方式进行理解吧

首先给出一排数字:4 , 1 , 3 , 16 , 12 , 9 , 11 , 19 , 7 , 10 ,将他们依次放入树中

 在这整颗树中,你可发现,根节点4的左边全是小于它的,在根结点4的右边全是大于它的

而这时你遍历中序遍历的时候,你就会发现它们全都是从小到大排列的,因为中序遍历的顺序是左根右,那不就是以根为先把比根大的遍历完,再遍历小的了嘛

接下来就是代码实现了

二叉搜索树的初始化

void intitree(root &s,int fatheroot)
{
	s = (root)malloc(sizeof(node));
	if (s == NULL)printf("分配内存失败");
	s->left = NULL;							//将左右结点变为空
	s->right = NULL;			
	s->date = fatheroot;					//赋值给根节点
}

插入数据

void inserttree(root s, int x)
{
	root temp = s;									//用来指向插入结点的前一个结点
	root prev = NULL;								//用来保存插入的结点
	while (temp!=NULL)								//不断找插入结点的前一个结点
	{
		prev = temp;
		if (x < temp->date) {
			temp = temp->left;
		}
		else if (x > temp->date) {
			temp = temp->right;
		}
		else return;
	}
	if (x < prev->date)								//判断到底是在左边还是右边
	{
		prev->left = (root)malloc(sizeof(node));
		prev->left->date = x;
		prev->left->left = NULL;
		prev->left->right = NULL;
	}
	if (x > prev->date)
	{
		prev->right = (root)malloc(sizeof(node));
		prev->right->date = x;
		prev->right->left = NULL;
		prev->right->right = NULL;
	}
}

那么接下来,如果我想查找一个数,应该是怎么查找的呢,我们是按二叉搜索树的性质进行查找的,因为我们一旦找到了谁比谁大,就能排除掉一半的数据,例如9,那是不是8左边的数据都比9小了呢,所以这个还比一般的查找时间要快一下

查找

void serch(root s, int x)
{
	root temp=s;
	while (temp != NULL)							//不断的搜索整颗树
	{
		if (temp->date == x)
		{
			printf("有这个数");
			return ;
		}
		if (temp->date > x)temp = temp->left;       //找左边的树
		else if (temp->date < x)temp = temp->right;	//找右边的树
	}
	printf("没有这个数");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值