本文链接:
二叉排序树(Binary Sort Tree)c语言 二叉排序树,又称为二叉查找树。它或则是一颗空树,或者是带有以下性质的二叉树:
构造二叉排序树的目的,并不是为了顺序,而是为了提升查找和插入删除关键字的速度。
以下程序在DEV C++中安装运行通过。
#include
#include
/*二叉树的二叉链表结点结构定义*/
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(keydata)
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(keydata)
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(keydata)
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成功!");
}运行结果如图所示。
二叉排序树的查找性能取决于二叉排序树的颜色c语言 二叉排序树,二它的外形是不确定的。极端右斜树的查找时间复杂度为O(n),等同于顺序查找;而平衡二叉树的查找时间复杂度为O(logn),等同于折半查找。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-120513-1.html