C语言实现二叉排序树的相关操作

本文介绍二叉排序树的基本概念及其在C++中的实现,包括查找、插入和删除节点等核心操作。通过具体示例展示了如何构建和维护二叉排序树,并分析了不同树形对查找性能的影响。

二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:

  • 若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值
  • 若它的右子树不为空,则右子树上的所有结点的值均大于它的根结点的值
  • 它的左右子树也分别为二叉排序树
构造二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。
以下程序在DEV C++中调试运行通过。
#include<stdio.h>
#include<stdlib.h>

/*二叉树的二叉链表结点结构定义*/
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

/*递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值为NULL,若查找成功,则指针P指向该数据元素结点,并返回1,否则指针p指向查找路径上访问的最后一个节点并返回0*/
int SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
	if(!T)//查找不成功
	{
		*p=f;
		return 0; 
	} 
	else if(key==T->data)//查找成功 
	{
		*p=T;
		return 1;
	}
	else if(key<T->data)
		return SearchBST(T->lchild,key,T,p);//在左子树继续查找 
	else
		return SearchBST(T->rchild,key,T,p);//在右子树继续查找 
}

/*当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1,否则返回0*/
int InsertBST(BiTree *T,int key)
{
	BiTree p,s;
	if(!SearchBST(*T,key,NULL,&p))//查找不成功
	{
		s=(BiTree)malloc(sizeof(BiTNode));
		s->data=key;
		s->lchild=s->rchild=NULL;
		if(!p)
			*T=s;//插入s为新的根结点
		else if(key<p->data)
			p->lchild=s;//插入s为左孩子
		else
			p->rchild=s;//插入s为右孩子
		return 1; 
	} 
	else
		return 0;
 } 

/*若二叉排序树T中存在关键字key的数据元素时,则删除该数据元素节点,并返回1;否则返回0*/ 
int DeleteBST(BiTree *T,int key)
{
	if(!T)
		return 0;
	else
	{
		if(key==(*T)->data)
			return Delete(T);
		else if(key<(*T)->data)
			return DeleteBST(&(*T)->lchild,key);
		else
			return DeleteBST(&(*T)->rchild,key);
	}
}

int Delete(BiTree *p)
{
	BiTree q,s;
	if((*p)->rchild==NULL)//右子树为空只需重接它的左子树
	{
		q=*p;*p=(*p)->lchild;free(q);
	} 
	else if((*p)->lchild==NULL)
	{
		q=*p;*p=(*p)->rchild;free(q);
	} 
	else//左右子树均不空
	{
		q=*p;s=(*p)->lchild;
		while(s->rchild)
		{
			q=s;s=s->rchild;
		}
		(*p)->data=s->data;
		if(q!=*p)
			q->rchild=s->lchild;
		else
			q->lchild=s->lchild;
		free(s);
	} 
	return 1;
}

int main()
{
	int i,j;
	int a[10]={62,88,58,47,35,73,51,99,37,93};
	BiTree T=NULL,p;
	//二叉排序树的插入和创建 
	for(i=0;i<10;i++)
	{
		InsertBST(&T,a[i]);
	}
	j=SearchBST(T,51,NULL,&p);
	if(j=1)
		printf("搜索51成功!");
	j=DeleteBST(&T,47);
	if(j=1)
		printf("删除47成功!");
}
运行结果如图所示。

二叉排序树的查找性能取决于二叉排序树的形状,二它的形状是不确定的。极端右斜树的查找时间复杂度为O(n),等同于顺序查找;而平衡二叉树的查找时间复杂度为O(logn),等同于折半查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值