编程实现二叉排序树的创建、插入、删除和查询
#include <bits/stdc++.h>
//二叉排序树
using namespace std;
int a[1005];
typedef struct BTnode
{
char data;
BTnode *lchild,*rchild;
} BTnode,*BTtree;
BTtree creatBTtree()
{
BTtree bt=NULL;
return bt;
}
void InOrderTraverseBTtree(BTtree T)//中序遍历
{
if(T)
{
InOrderTraverseBTtree(T->lchild);
printf("%d ",T->data);
InOrderTraverseBTtree(T->rchild);
}
else
{
return;
}
}
int SearchBST(BTtree T,int e,BTtree f,BTtree *p)//寻找元素是否存在
//T为当前根节点,e为要查找的元素,f为T的父节点,p为找到的元素节点或没找到时的根节点
{
if(!T)//若树空
{
*p=f;
return 0;
}
else if(T->data==e)//若找到该元素
{
*p=T;
return 1;
}
else if(e<T->data)//如果该元素比根节点值小
return SearchBST(T->lchild,e,T,p);//在T左子树中找
else//如果该元素比根节点值大
return SearchBST(T->rchild,e,T,p);//在T右子树中找
}
int InsertBST(BTtree *T,int e)//插入函数
{
BTtree s=NULL,p;
if(!SearchBST(*T,e,NULL,&p))//如果该元素不在树中
{
s=new BTnode;
s->data=e;
s->lchild=s->rchild=NULL;//新建节点s
if(!p)//若p为空指针
{
*T=s;
}
else if(p->data>e)//如果该元素比根节点值小
{
p->lchild=s;
}
else//如果该元素比根节点值大
{
p->rchild=s;
}
return 1;
}
else
return 0;
}
int Delete(BTtree *p)//删除函数的具体操作
{
BTtree 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(*p!=q)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
int DeleteBST(BTtree *T,int e)//删除函数
{
if(!*T)
{
return -1;
}
else
{
if((*T)->data==e)
{
return Delete(T);
}
else if(e<(*T)->data)
{
return DeleteBST(&(*T)->lchild,e);
}
else
{
return DeleteBST(&(*T)->rchild,e);
}
}
}
int main()
{
BTtree T,p;
T=creatBTtree();
int x,n;
n=0;
printf("请输入你要创建二叉排序树的数字,输入0表示结束输入:");
while(~scanf("%d",&x))
{
if(!x)
break;
a[++n]=x;
}
for(int i=1; i<=n; i++)
{
InsertBST(&T,a[i]);
}
printf("中序遍历该二叉排序树的结果为:");
InOrderTraverseBTtree(T);
printf("\n");
int num;
printf("请输入你要插入的数字:");
cin>>num;
InsertBST(&T,num);
printf("插入该数字后中序遍历该二叉排序树的结果为:");
InOrderTraverseBTtree(T);
printf("\n");
int xx,y;
printf("请输入你要查询的数字:");
cin>>xx;
if(SearchBST(T,xx,NULL,&p))
{
printf("该数存在\n");
}
else
{
printf("该数不存在\n");
}
printf("请输入你要删除的数字:");
cin>>y;
if(!SearchBST(T,y,NULL,&p))
{
printf("该数不存在,无法进行删除操作!\n");
}
else
{
DeleteBST(&T,y);
printf("进行删除操作后中序遍历该二叉排序树的结果为:");
InOrderTraverseBTtree(T);
}
printf("\n");
return 0;
}
/*
1 5 4 2 6 8 7 9 11 14 13 12 16 19 0
*/