#include<stdio.h>
#include<stdlib.h>
/*定义结构体*/
typedef int ElemType;
typedef struct node 
{
    ElemType data;
    struct node *lch,*rch;
}Snode;
/*定义各方法*/
Snode *creat_bt();
Snode *insert(Snode *t,Snode *s);
void inorder(Snode *p);
void delet(Snode *t,int key);
void bstsrch(Snode *root,Snode *p,Snode *q,int K);
/*实现主菜单*/
main()
{
    Snode *H=NULL,*P=NULL,*Q=NULL,*L=NULL,*M=NULL;int cord,n;
    do{
        printf("\n      主菜单");
        printf("\n 1.建立二叉排序树");
        printf("\n 2.中根遍历二叉树");
        printf("\n 3.查找二叉排序树");
        printf("\n 4.删除二叉树排序树的结点");
        printf("\n 5.结束程序运行");
        printf("\n============================");
        printf("\n 请输入您的选择(1,2,3,4,5):");
        scanf("%d",&cord);
        switch(cord)
        {
        case 1:H=creat_bt(); break;
        case 2:printf("\n 中序遍历输出");inorder(H); break;
        case 3:    printf("\n 请输入您要查找的数:");
                scanf("%d",&n);
                bstsrch(H,P,Q,n); break;
        case 4:    printf(" 请输入您要删除的结点:");
                scanf("%5d",&n);
                delet(H,n);
                printf("\n 操作后的二叉排序树是:");
                inorder(H);break;
        case 5:exit(0);
        }
    }while(cord<=5);
}
/*建立二叉排序树*/
Snode *creat_bt()
{
    Snode *t0,*s;int n,i;ElemType k;
    printf("\n n=");scanf("%d",&n);
    t0=NULL;
    for(i=1;i<=n;i++)
    {
        printf("\n %d key=",i);scanf("%d",&k);
        s=(Snode *)malloc(sizeof(Snode));
        s->data=k;s->lch=NULL;s->rch=NULL;
        t0=insert(t0,s);
    }
    return(t0);
}
/*插入数据*/
Snode *insert(Snode *t,Snode *s)
{
    if(t==NULL) t=s;
    else if(s->data<t->data)
        t->lch=insert(t->lch,s);
    else t->rch=insert(t->rch,s);
    return(t);
}
/*中根遍历二叉树*/
void inorder(Snode *p)
{
    if(p!=NULL)
    {
        inorder(p->lch);//递归输出左子树
        printf("%8d",p->data);//输出根结点
        inorder(p->rch);//递归输出右子树
    }
}
/*查找二叉排序树*/
void bstsrch(Snode *root,Snode *p,Snode *q,int K)
{
    
    int flag;
    p=NULL;q=root;
    flag=0;
    while((q!=NULL)&&(flag==0))
        if(q->data==K)
        {
            printf("  succ %5d",q->data);flag=1;
        }
        else if(K<q->data)
        {
            p=q;q=q->lch;
        }
        else
        {
            p=q;
            q=q->rch;
        }
        if(flag==0) printf("NO node");
}
/*删除结点*/
void delet(Snode *t,int key)
{
    int bool=1;
    Snode *q=NULL,*s=NULL,*p=NULL,*f=NULL;
    bstsrch(t,f,p,key);
    while(p!=NULL){
        if(p->lch==NULL) s=p->rch;
        else if(p->rch==NULL) s=p->lch;
        else{
        q=p;s=p->rch;
        while(s->lch!=NULL){q=s;s=s->lch;}
        if(q==p) q->rch=s->rch;
        else q->lch=s->rch;
        p->data=s->data;
        free(s);bool=0;
        }
        if(bool==1)
        {
            if(f==NULL) t=s;
            else if(f->lch==p) f->lch=s;
            else f->rch=s;
            free(p);
        }
    }
}


不知道为什么我运行时,删除节点,出现了问题.请高手指教,并帮小弟修改一下删除节点的代码.在此多谢!