#include<stdio.h>
#include <stdlib.h>
typedef struct BSTNode{
int data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
BSTree InsertBST(BSTree T,int data);
BSTree CreatBST(BSTree T);
bool SearchBST(BSTree T,int key);
void DeleteBST(BSTree T,int key);
void PrintBST(BSTree T);
bool DeleteBST(BSTree *T, int key);
bool Delete(BSTree *T);
int main(){
BSTree T;
T=NULL;
int key;
bool n;
printf(“请输入数据(输0停止):\n”);
T=CreatBST(T);
do{
printf(“请输入要查找的数据:\n”);
scanf(“%d”,&key);
n=SearchBST(T,key);
}while(!n);
printf(“请输入要删除的数据:\n”);
scanf(“%d”,&key);
DeleteBST(&T,key);
printf(“中序显示:\n”);
PrintBST(T);
printf(“\n”);
return 0;
}
BSTree InsertBST(BSTree T,int data){
BSTree s;
if(!T){
s=(BSTNode *)malloc(sizeof(BSTree));
s->data=data;
s->lchild=NULL;
s->rchild=NULL;
return s;
}
else if(T->data<data){
T->rchild=InsertBST(T->rchild,data);
}
else if(T->data>data){
T->lchild=InsertBST(T->lchild,data);
}
return T;
}
BSTree CreatBST(BSTree T){
int data;
scanf(“%d”,&data);
while(data!=0){
T=InsertBST(T,data);
scanf(“%d”,&data);
}
return T;
}
bool SearchBST(BSTree T,int key){
if(!T){
printf(“未找到该数据,请重新输入!\n”);
return false;
}
else if(T->data==key){
printf(“成功查找到数据:%d\n”,T->data);
return true;
}
else if(T->data>key){
SearchBST(T->lchild,key);
}
else if(T->data<key){
SearchBST(T->rchild,key);
}
}
void PrintBST(BSTree T){
if (!T)
return;
PrintBST(T->lchild);
printf(“%d “, T->data);
PrintBST(T->rchild);
}
/*
* 在以*T为根结点的树中,删除与key相同的结点。
* 如果没有此结点返回FALSE。
*/
bool DeleteBST(BSTree *T, int key){
if (!*T) //空树。查无此结点。
return false;
else if (key == (*T)->data)
{
Delete(T);
return true;
}
else if (key < (*T)->data)
{
return DeleteBST(&((*T)->lchild), key);
}
else
{
return DeleteBST(&((*T)->rchild), key);
}
}
/*
* 删除*T指向的结点
*/
bool Delete(BSTree *T)
{
BSTree L;
//*T既没有左孩子,又没有右孩子,为叶子结点
if (!(*T)->lchild && !(*T)->rchild)
*T = NULL;
//*T只有右孩子
else if (!(*T)->lchild)
*T = (*T)->rchild;
//*T只有左孩子
else if (!(*T)->rchild)
*T = (*T)->lchild;
//*T既有左孩子,又有右孩子
else
{
L = (*T)->lchild;//L指向被删除结点的左子树
//寻找L的最右孩子
while (L->rchild)
L = L->rchild;
//把*T的右子树接到左子树最右孩子的右子树上。
L->rchild = (*T)->rchild;
//*T的左子树直接作为*T父结点的子树
*T = (*T)->lchild;
}
return true;
}