二叉树的右子树插入和删除出问题,不懂哪错了
程序代码:#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);
}







