用C语言编的这个程序可以运行,但是无法按照想要的建立二叉树,哪位高手能帮忙改一下,谢谢

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}bitree;
void menu()
{

printf("1.按先序递归方式创建二叉树\n");
printf("2.先序递归遍历二叉树\n");
printf("3.中序递归遍历二叉树\n");
printf("4.后序递归遍历二叉树\n");
printf("5.按层次遍历二叉树\n");
printf("6.输出二叉树高度\n");
printf("0.推出程序\n");
}

//先序递归创建二叉树
bitree *Creat()
{
char ch;
bitree *s;
scanf("%c",&ch);
if(ch=='@')
s=NULL;
else
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=Creat();
s->rchild=Creat();
}
return s;
}
//先序递归遍历二叉树
void preorder(bitree *p)
{
if(p!=NULL)
{
printf("%c\n",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
}
//中序递归遍历二叉树
void inorder(bitree *p)
{
if(p!=NULL)
{
inorder(p->lchild);
printf("%c\n",p->data);
inorder(p->rchild);
}
}
//后序递归遍历二叉树
void postorder(bitree *p)
{
if(p!=NULL)
{
postorder(p->lchild);
postorder(p->rchild);
printf("%c\n",p->data);
}
}

//按层次遍历二叉树
void levelorder(bitree *p)
{
bitree *q[20];
int front=0,rear=0;
if(p!=NULL)
{
rear++; //节点指针进入队列
q[rear]=p;
}
while(front!=rear) //队列不为空
{
front++;
p=q[front];
printf("%c\n",p->data);
if(p->lchild)
{
rear++;
q[rear]=p->lchild;
}
if(p->rchild)
{
rear++;
q[rear]=p->rchild;
}
}
}

//输出二叉树高度
int fstdepth(bitree *p)
{ int d1,d2;
if(p==NULL) return 0;
else
{
d1=fstdepth(p->lchild);
d2=fstdepth(p->rchild);
return 1+(d1>d2?d1:d2);
}
}
void main()
{
int choice=0,dep;
bitree *s;
menu();
printf("请选择对应的功能选项进行相应操作:");
fflush(stdin);
scanf("%d",&choice);
getchar();
while(1)
{
switch(choice)
{
case 1:
{
printf("请按先序递归方式输入二叉树各结点,@表示虚结点:\n");
s=Creat();
printf("二叉树创建成功!\n");
break;
}
case 2:
{
preorder(s);
break;
}
case 3:
{
inorder(s);
break;
}
case 4:
{
postorder(s);
break;
}
case 5:
{
levelorder(s);
break;
}
case 6:
{
dep=fstdepth(s);
printf("二叉树的深度为dep=%d\n",dep);
break;
}
case 0:
exit(0);
}
menu();
printf("请选择对应的功能选项进行相应操作:");
fflush(stdin);
scanf("%d",&choice);
getchar();
}
}

第1个回答  2012-12-04
你使用自己的程序时,输入先序创建二叉树中输入不能是纯的先序遍历,要在没结点的地方加上“@”,没有二叉树只用先序遍历就能创建的方法。其他小函数没什么问题。
第2个回答  2012-12-05
//先序递归创建二叉树
bitree *Creat()
{
char ch;
bitree *s;
scanf("%c",&ch);
if(ch=='@')
{
s=NULL;
return s;
}
else
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=Creat();
s->rchild=Creat();
}

}

如果报错,那你最好写成void Create(bittree *s)的形式、
第3个回答  2012-12-04
我推测,你的输入数据是否有问题。

最简单的二叉树1到2和3

输入应该是12@@3@@

你看看是不是这个问题,代码扫了一眼,没大毛病本回答被提问者和网友采纳