输入互不相同的一组整数,构造一棵二叉排序树,要求:
① 按递减有序的顺序输出;
② 输入一个整数,查找该整数是否在该二叉排序树中,查找成功返回1,否则返回0;
③ 在②中,若查找成功,则将该结点从二叉排序树中删除。
#include<stdio.h>
#include<bits/stdc++.h>
typedef struct Bitnode{
int data;
struct Bitnode *rchild,*lchild;
}Bitnode,*Bitree;
int searchbst(Bitree bst,int key,Bitree &p){
//查找
Bitnode *s=bst,*f=NULL;
if(!s){
p=f;
return 0;
}
while(s!=NULL)
if(key==s->data){
p=s;
return 1;
}
else if(key>s->data){
f=s;
s=s->rchild;
}
else{
f=s;
s=s->lchild;
}
p=f;
return 0;
}
int searchbst2(Bitree bst,int key){
//查找
Bitnode *s=bst,*f=NULL;
if(!s){
return 0;
}
while(s!=NULL)
if(key==s->data){
return 1;
}
else if(key>s->data){
f=s;
s=s->rchild;
}
else{
f=s;
s=s->lchild;
}
return 0;
}
void insertbst(Bitree &bst,int e){
//插入
Bitnode *s,*p;
if(bst==NULL){
bst=(Bitree)malloc(sizeof(Bitnode));
bst->data=e;
bst->lchild=bst->rchild=NULL;
}
else{
if(!searchbst(bst,e,p)){
s=(Bitree)malloc(sizeof(Bitnode));
s->data=e;
s->lchild=s->rchild=NULL;
if(e<p->data)
p->lchild=s;
else
p->rchild=s;
}
}
}
void creatbst(Bitree &bst){
//建立二叉排序树
Bitnode *p;
int a;
bst=NULL;
scanf("%d",&a);
while(a!=0){
if(!searchbst(bst,a,p))
insertbst(bst,a);
scanf("%d",&a);
}
}
void traverse(Bitree bt){
//递归中序遍历
if(bt){
traverse(bt->rchild);
printf("%d ",bt->data);
traverse(bt->lchild);
}
}
void deleten(Bitree &bst,int key){
//删除值为key的节点
Bitnode *pc,*q,*s,*p=bst,*f=NULL;
while(p && p->data!=key){
f=p;
if(p->data>key)
p=p->lchild;
else
p=p->rchild;
}
if(!p){
printf("该树中没有需删除的节点\n");return;
}
if(p->lchild && p->lchild){
q=p; s=p->lchild;
while(s->rchild){
q=s;s=s->rchild;
}
p->data=s->data;
if(q==p)
q->lchild=s->lchild;
else
q->rchild=s->lchild;
free(s);
}
else{
if(p->lchild)
pc=p->lchild;
else
pc=p->rchild;
if(!f)
bst=pc;
else if(f->lchild==p)
f->lchild=pc;
else
f->rchild=pc;
free(p);
}
}
int main()
{
int x;
Bitree bst;
creatbst(bst);
traverse(bst);
printf("\n输入你要查找的元素:\n");
scanf("%d",&x);
if(searchbst2(bst,x)){
printf("查找成功!\n");
deleten(bst,x);
printf("该节点已删除!\n");
}
else
printf("查找失败!\n");
}