#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct BTree{
int date;
BTree *lchild;
BTree *rchild;
}BTree;
//插入数据
int BSTInsert(BTree *&p,int key){
if(p==NULL){
p=(BTree*)malloc(sizeof(BTree));
p->date=key;
p->lchild=NULL;
p->rchild=NULL;
return 1;
}else {
if(key==p->date) return 0;
else if(key<p->date){
return BSTInsert(p->lchild,key);
}else if(key>p->date){
return BSTInsert(p->rchild,key);
}
}
}
int BSTDelete(BTree *&p,int key){
BTree *x,*y;
x=p;
y=NULL;
int flag=-1;
while(x->date!=key){
if(key>x->date){
y=x;//记录父节点
x=x->rchild;
flag=1;
}else{
y=x;
x=x->lchild;
flag=0;
}
}
if(x->date!=key){//如果未找到则返回两个空指针
x=NULL;
y=NULL;
printf("不存在此元素");
return 0;
}
if(x!=NULL){
if(x->lchild!=NULL&&x->rchild!=NULL){
BTree *t=x;
y=x;
x=x->lchild;//向左走一步
while(x->rchild!=NULL){
y=x;
x=x->rchild;//向右走到头
}
t->date=x->date;
if(x->lchild!=NULL) y->rchild=x->lchild;
else y->rchild=NULL;
free(x);
return 1;
}else if(x->rchild!=NULL&&x->lchild==NULL){
if(y->lchild=x) y->lchild=x->rchild;
else if(y->rchild=x) y->rchild=x->rchild;
free(x);
return 1;
}else if(x->lchild!=NULL&&x->rchild==NULL){
if(y->lchild=x) y->lchild=x->lchild;
else if(y->rchild=x) y->rchild=x->lchild;
free(x);
return 1;
}
else if(x->lchild==NULL&&x->rchild==NULL){
if(y->lchild=x) y->lchild=NULL;
else if(y->rchild=x) y->rchild=NULL;
free(x);
return 1;
}
}
}
void createBTree(BTree *&p,int t[],int length){
for(int i=0;i<length;i++){
int j=BSTInsert(p,t[i]);
//printf("%d ",j);
}
}
int main(){
int temp[]={5,1,8,0,3,7,9,2,4};
BTree *p=NULL;
createBTree(p,temp,9);
printf("%d ",p->date);
printf("%d ",p->lchild->date);
printf("%d ",p->rchild->date);
int r=BSTDelete(p,5);//删除5
printf("\n结果:%d",r);
printf("\n%d ",p->date);
r=BSTDelete(p,1);//删除5
printf("\n结果:%d",r);
printf("\n%d ",p->lchild->date);
}
代码运行结果: