二叉排序树的创建查找与删除
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *lch;
struct Node *rch;
}BiNode, *BiTree;
void Creat(BiTree *T); //创建一个二叉排序树
void Insert(BiTree *T, int data); //二叉排序树的插入
int Search1(BiTree *T, int number); //查找,递归方法
int Search2(BiTree *T, int number); //查找,非递归方法
BiTree Delete(BiTree T, int number); //删除一个结点
BiTree iterates(BiTree T, int number); //找出要删除结点的前驱
void Inorder(BiTree T); //中序遍历
int main(void)
{
BiTree T;
int number;
Creat(&T); //创建一个二叉排序树
Inorder(T); //中序遍历
/* printf("请输入要查找的数:");
scanf("%d",&number);
if(Search1(T, number)) //查找,递归方法
printf("查找成功!");
else
printf("查找失败!");
*/
printf("请输入要查找的数:");
scanf("%d",&number);
if(Search2(T, number)) //查找,非递归方法
printf("查找成功!");
else
printf("查找失败!");
printf("请输入要删除的数:");
scanf("%d",&number);
T = Delete(T, number); //删除一个结点
Inorder(T); //中序遍历
return 0;
}
void Creat(BiTree *T) //创建一个二叉排序树
{
int data;
*T = NULL;
printf("请输入数据:");
scanf("%d",&data);
while(data != 1000)
{
Insert(T, data);
printf("请输入数据:");
scanf("%d",&data);
}
}
void Insert(BiTree *T, int data) //二叉排序树的插入
{
BiTree s;
if(*T == NULL)
{
s = (BiNode *)malloc(sizeof(BiNode));
s->data = data;
s->lch = s->rch = NULL;
*T = s;
}
else if(data > (*T)->data)
Insert(&((*T)->rch), data);
else
Insert(&((*T)->lch), data);
}
int Search1(BiTree T, int number) //查找,递归方法
{
if(!T)
return 0;
else if(number == T->data)
return 1;
else if(T->lch == NULL && T->rch == NULL)//若一直搜索到最下面的叶子节点都没有则返回0
return 0;
else if(T->data > number)
Search(T->lch, number);
else
Search(T->rch, number);
}
int Search2(BiTree T, int number) //查找,非递归方法
{
BiTree p;
p = T;
while(p)
{
if(p->data == number)
return 1;
else if(p->lch == NULL && p->rch == NULL)
return 0;
else if(p->data > number)
p = p->lch;
else
p = p->rch;
}
return 0;
}
BiTree Delete(BiTree T, int number) //删除一个结点
{
BiNode *p, *w, *s;
p = (BiNode *)malloc(sizeof(BiNode));
p =T;
if(!T)
{
printf("此树为空!");
return T;
}
else if(!Search1(T, number))
{
printf("这个树中没有这个数!");
return T;
}
else
{
while(p->data == number) //找到所要删除的结点
{
w = p; //w为所求结点的根结点
if(p->data >number)
p = p->lch;
else
p = p->rch;
}
if(p->lch == NULL && p->rch == NULL)//如果这个结点为叶子结点,则直接删除
{
free(p);
}
else if(p->rch == NULL) //如果所求结点只有左子树
{
if(w->rch == p)
w->rch = p->lch;
else
w->lch = p->lch;
free(p);
}
else if(p->lch == NULL) //如果所求结点只有右子树
{
if(w->lch == p)
w->rch = p->rch;
else
w->lch = p->rch;
free(p);
}
else //所要删除的结点既有左子树又有右子树
{
s = iterates(T, number); //s指向要删除结点的前驱结点
if(w->lch == p)
{
w->lch = s;
if(s->lch != NULL)
s = s->lch;
}
else
{
w->rch = s;
if(s->lch != NULL)
s = s->lch;
}
}
}
}
BiTree iterates(BiTree T, int number) //找出要删除结点的前驱
{
BiNode *p, *w;
w = T;
if(w->data == number)
{
p = w;
iterates(T->lch, number);
iterates(T->rch, number);
}
return p;
}
void Inorder(BiTree T) //中序遍历
{
if(T)
{
Inorder(T->lch);
printf("%d ", T->data);
Inorder(T-> rch);
}
}