二叉排序树问题,请帮忙纠错
二叉排序树的C程序——有的结果运行正确,有的结果会产生内存错误 程序中的数据在删除24时出现了内存错误!
#include <stdio.h>//输入六个整数45、24、53、12、37、9,插入数据元素13,删除数据元素24和53
#include <stdlib.h>
typedef struct BiTNode//结点结构
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Insert(BiTree T,int e)//插入操作
{
BiTree p=T, f=NULL, s;
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if (T==NULL) //插入 s 为新的根结点
{
T = s;
}
else
{//查找插入位置
while(p && p->data!=e)
{
if (p->data>e) {f=p; p=p->lchild;}
else {f=p; p=p->rchild;}
}
if (p==NULL&&e <f->data)
f->lchild = s; // 插入 s 为 f 的左孩子
else if(p==NULL&&e>f->data) f->rchild = s; // 插入 s 为 f 的右孩子
else {printf("插入出错!");exit(0);}
}
return T;
}
void Delete(BiTree T,int x)
{
BiTree f=NULL,p=T,q,s;
while(p&&p->data!=x)
{
if(p->data>x){f=p;p=p->lchild;}
else
{ f=p;p=p->rchild;}
}
if(p==NULL) {printf("查找失败!");exit(0);}
if(p->lchild==NULL)//左为空,重接右结点或左右均为空
{
if(f->lchild==p) f->lchild=p->rchild;
else f->rchild=p->rchild;
free(p);
}
else if(p->rchild==NULL)//右为空,重接左结点
{
if(f->lchild==p) f->lchild=p->lchild;
else f->rchild=p->lchild;
free(p);
}
else//左右都不为空
{
q=p;
s=p->lchild;
while(s->rchild!=NULL)
{
q=s;s=s->rchild;
}
p->data=s->data;
if(q==p) p->lchild=s->lchild;
else q->rchild=s->lchild;
free(p);
}
}
void Inorder(BiTree T){ // 中序遍历二叉树
if (T)
{
Inorder(T->lchild); // 遍历左子树
printf("%d ",T->data); // 访问结点
Inorder(T->rchild);// 遍历右子树
}
}
void Menu(BiTree T)
{
int i,e;
printf("1.插入元素\n");
printf("2.删除元素\n");
printf("3.结束\n");
printf("请选择需要的功能:\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入要插入的元素:");
scanf("%d",&e);
T=Insert(T,e);
printf("插入后中序遍历结果为:\n");
Inorder(T);
printf("\n");
break;
case 2:
printf("请输入要删除的元素:");
scanf("%d",&e);
Delete(T,e);
printf("删除后中序遍历结果为:\n");
Inorder(T);
printf("\n");
break;
default: exit(0);
}
Menu(T);
}
void main()
{
int e,i;
BiTree T;
T=NULL;
printf("请输入六个数构造二叉排序树:\n");
for(i=1;i <7;i++)
{
scanf("%d",&e);
T=Insert(T,e);
}
printf("此二叉排序树的中序遍历结果为:\n");
Inorder(T);
printf("\n");
Menu(T);
}
希望高手帮忙看一下!