二叉树的右子树插入和删除出问题,不懂哪错了
程序代码:
#include<stdio.h> #include<stdlib.h> static int n=0; static int n1=0; typedef struct bitnode { int data; struct bitnode *lchild,*rchild; }Bitnode,*Bitree; Bitree create() //建立二叉树 { Bitree t; int x; printf("请输入结点的数据:"); scanf("%d",&x); if(x==0) t=NULL; else { t=(Bitnode*)malloc(sizeof(Bitnode)); t->data=x; t->lchild=create(); //左孩子获得新指针值 t->rchild=create(); //右孩子获得新指针值 } return t; } void preorder(Bitree t) //先序遍历二叉树 { if(t) { printf("%-4d",t->data); n++; if(t->lchild==NULL&&t->rchild==NULL) //求叶子结点数 n1++; preorder(t->lchild); preorder(t->rchild); } } Bitree insertL(Bitree bt,int x,Bitree parent) //左孩子插入函数 { Bitree p; if(parent==NULL) { printf("插入出错\n"); return NULL; } if((p=(Bitnode *)malloc(sizeof(Bitnode)))==NULL) return NULL; p->data=x; p->lchild=NULL; p->rchild=NULL; if(parent->lchild==NULL) parent->lchild=p; else { p->lchild=parent->lchild; parent->lchild=p; } return bt; } Bitree insertR(Bitree bt,int x,Bitree parent) //右孩子插入函数 { Bitree p; if(parent==NULL) { printf("插入出错\n"); return NULL; } if((p=(Bitnode *)malloc(sizeof(Bitnode)))==NULL) return NULL; p->data=x; p->lchild=NULL; p->rchild=NULL; if(parent->rchild==NULL) parent->rchild=p; else { p->rchild=parent->rchild; parent->rchild=p; } return bt; } Bitree delL(Bitree bt,Bitree parent) //左孩子删除函数 { Bitree p; if(parent==NULL||parent->lchild==NULL) { printf("删除出错\n"); return NULL; } p=parent->lchild; parent->lchild=NULL; free(p); return bt; } Bitree delR(Bitree bt,Bitree parent) //右孩子删除函数 { Bitree p; if(parent==NULL||parent->rchild==NULL) { printf("删除出错\n"); return NULL; } p=parent->rchild; parent->rchild=NULL; free(p); return bt; } Bitree search(Bitree bt,int x) //查找函数 { Bitree p; if(bt) { if(bt->data==x) return bt; if(bt->lchild) p=search(bt->lchild,x); if(p) return p; if(bt->rchild) p=search(bt->rchild,x); if(p) return p; } return NULL; } void main() { int i,x,y; Bitree p; Bitree t=NULL; do { printf("\n"); printf("------------------------------------------\n"); printf("1.建立二叉树:\t\t"); printf("2.先序遍历二叉树\n"); printf("3.计算树中的结点个数\t"); printf("4.左孩子插入\n"); printf("5.右孩子插入\t\t"); printf("6.左孩子删除\n"); printf("7.右孩子删除\t\t"); printf("8.结束程序运行\n"); printf("------------------------------------------\n"); printf("请输入1-8:"); scanf("%d",&i); switch(i) { case 1: t=create(); break; case 2: if(t==NULL) { printf("二叉树为空\n"); } preorder(t); break; case 3: printf("二叉树的结点总数为:%d\n",n); printf("二叉树的叶子结点数为:%d\n",n1); break; case 4: printf("请输入所要插入结点的数据:"); scanf("%d",&x); p=search(t,x); printf("请输入要插入的数据:"); scanf("%d",&y); t=insertL(t,y,p); break; case 5: printf("请输入所要插入结点的数据:"); scanf("%d",&x); p=search(t,x); printf("请输入要插入的数据:"); scanf("%d",&y); t=insertR(t,y,p); break; case 6: printf("请输入所要删除左子树的结点的数据:"); scanf("%d",&x); p=search(t,x); t=delL(t,p); break; case 7: printf("请输入所要删除右子树的结点的数据:"); scanf("%d",&x); p=search(t,x); t=delR(t,p); break; case 8: printf("—————谢谢使用—————\n"); exit(0); } }while(i>=1&&i<8); }