各位大侠看看,错在哪呢?输出的结果不是我想要的
题目是这样的: 设计一个读入一串整数构成一颗二叉排序树的程序,从二叉
排序树中删除一个结点,使该二叉树仍保持二叉排序树的特性
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define FALSE 0
#define TRUE 1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)< (b))
int flag=1;
int key;
typedef struct BiNode
{
int elem;
struct BiNode *Lchild,*Rchild;
}BiNode,*BiTree;
bool SearchBST(BiTree T,int e,BiTree f,BiTree &p) //查找二叉排序树中有无e元素
{
if(!T)
{
p=f;
return FALSE;
}
else if(EQ(e,T->elem))
{
p=T;
return TRUE;
}
else if(LT(e,T->elem))
return SearchBST(T->Lchild,e,T,p);
else
return SearchBST(T->Lchild,e,T,p);
}
void Print(int e) //打印函数
{
printf("%d\n",e);
}
bool InOrder(BiTree T,void(*visit)(int e)) //中序遍历
{
if(T)
{
InOrder(T->Lchild,visit);
visit(T->elem);
InOrder(T->Rchild,visit);
}
return TRUE;
}
bool InsertBST(BiTree &T, int e) //添加新的元素
{
BiTree p;
if(!SearchBST(T,e,NULL,p))
{
BiTree s=(BiTree)malloc(sizeof(BiNode));
s->elem=e;
s->Lchild=s->Rchild=NULL;
if(!p)
T=s;
else if(LT(e,p->elem))
p->Lchild=s;
else
p->Rchild=s;
return TRUE;
}
else return FALSE;
}
int CreatBST(BiTree &T) //创建二叉排序数
{
int e;
if(flag==1)
{
printf("输入根节点的值:");
scanf("%d",&e);
T=(BiTree)malloc(sizeof(BiNode));
T->elem=e;
T->Lchild=T->Rchild=NULL;
flag+=1;
}
printf("输入下一个节点的值:");
scanf("%d",&e);
while(e!=0)
{
InsertBST(T,e);
printf("输入下一个节点的值:");
scanf("%d",&e);
}
return TRUE;
}
bool Delete(BiTree &p) //删除其中的一个元素
{
if(!p->Rchild)
{
BiTree q=p;
p=p->Lchild;
free(q);
}
else if(!p->Lchild)
{
BiTree Q=p;
p=p->Rchild;
free(p);
}
else
{
BiTree q=p;
BiTree s=p->Lchild;
while(s->Rchild)
{
q=s;
s=s->Rchild;
}
p->elem=s->elem;
if(q!=p)
q->Rchild=s->Lchild;
else
q->Lchild=s->Lchild;
free(s);
}
return TRUE;
}
bool DeleteBST(BiTree &T,int e)
{
if(!T)
return FALSE;
else
{
if(EQ(e,T->elem))
return Delete(T);
else if(LT(e,T->elem))
return DeleteBST(T->Lchild,e);
else
return DeleteBST(T->Rchild,e);
}
}
int main()
{
BiTree T;
int e;
CreatBST(T);
InOrder(T,Print);
printf("输入你想插入的值:");
scanf("%d",&e);
InsertBST(T, e);
InOrder(T,Print);
printf("输入你想删除的值:");
scanf("%d",&e);
DeleteBST(T, e);
InOrder(T,Print);
return 0;
}