代码在pta运行就是答案错误,但是在devc++运行的结果和给的例子一模一样,为什么啊?
求解释,感谢!
void menu1()
{
printf("I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > ");
}
void menu2()
{
printf("1-先序 2-中序 3-后序 0-返回 > ");
}
void menu3()
{
printf("1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > ");
}
typedef struct S
{
char data;
struct S* left;
struct S* right;
} BT;
void creat(BT* * Bt)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
*Bt=NULL;
}
else
{
*Bt = (BT*)malloc(sizeof(BT));
(*Bt) ->data = ch;
creat(&((*Bt)->left));
creat(&((*Bt)->right));
}
return;
}
void xianxu(BT* t)
{
if(t)
{
printf("%c",t->data);
xianxu(t->left);
xianxu(t->right);
}
}
void zhongxu(BT* t)
{
if(t)
{
zhongxu(t->left);
printf("%c",t->data);
zhongxu(t->right);
}
}
void houxu(BT* t)
{
if(t)
{
houxu(t->left);
houxu(t->right);
printf("%c",t->data);
}
}
void bianli(BT* t)
{
printf("遍历\n");
menu2();
int input;
scanf("%d",&input);
getchar();
switch(input)
{
case 1 :
printf("先序遍历: ");
xianxu(t);
printf("\n");
break;
case 2:
printf("中序遍历: ");
zhongxu(t); printf("\n");
break;
case 3:
printf("后序遍历: ");
houxu(t); printf("\n");
break;
case 0:
break;
default:
printf("不正确的遍历选项!\n");
break;
}
}
int NUM1(BT*t)
{ int count = 0;
if(t==NULL)
return 0;
count = NUM1(t->left)+NUM1(t->right)+1;
return count;
}
int NUM2(BT* T)
{
if(T==NULL)
{
return 0;
}
int sum =0;
if(T->left==NULL&&T->right==NULL)
{
sum++;
}
int a = NUM2(T->left );
sum+=a;
int b = NUM2(T->right);
sum+=b;
return sum;
}
int deep(BT*t)
{
int m,n;
if(t==NULL)
{
return 0;
}
else
{
m = deep(t->left);
n = deep(t->right);
if(m>n)
return (m+1);
else
return (n+1);
}
}
void shuju(BT*t)
{
printf("数据\n");
menu3();
int input;
int sum1,sum2,sum3,sum4;
scanf("%d",&input);
getchar();
switch(input)
{
case 1:
sum1 = NUM1(t);
printf("结点数: %d\n",sum1);
break;
case 2:
sum2 = NUM2(t);
printf("叶子结点数: %d\n",sum2);
break;
case 3:
sum3 = NUM1(t) - NUM2(t);
printf("分枝结点数: %d\n",sum3);
break;
case 4:
sum4 = deep(t);
printf("深度: %d\n",sum4);
break;
case 0:
break;
default :
printf("不正确的数据选项!\n");
break;
}
}
void qingkong(BT**t)
{
if(*t)
{
qingkong(&((*t)->left));
qingkong(&((*t)->right));
free(*t);
*t = NULL;
}
}
void shuchu1( BT *t, int layer)
{
int k = layer;
if(t)
{
shuchu1(t->right, layer + 2);
while(--k) putchar(' ');
putchar(t->data);
putchar('\n');
shuchu1(t->left, layer + 2);
}
}
void shuchu( BT *t)
{
shuchu1(t, 1);
}
int main()
{
char input;
BT* T=NULL;
do
{ menu1();
scanf("%c",&input);
getchar();
switch(input)
{
case 'I' :
case 'i' :
printf("输入: ");
creat(&T);
getchar();
break;
case 'O' :
case 'o' :
printf("输出: \n");
shuchu(T);
break;
case 'C' :
case 'c' :
qingkong(&T);
printf("清空\n");
break;
case 'T' :
case 't' :
bianli(T);
break;
case 'D' :
case 'd' :
shuju(T);
break;
case 'q' :
case 'Q' :
break;
default :
printf("不正确的操作选项!\n");
}
}while(input!='Q'&&input!='q');
}
```c
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > x
不正确的操作选项!
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > I
输入: EIBJ##H###DF#A##G#C##
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > o
输出:
C
G
D
A
F
E
I
H
B
J
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > t
遍历
1-先序 2-中序 3-后序 0-返回 > 9
不正确的遍历选项!
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > T
遍历
1-先序 2-中序 3-后序 0-返回 > 0
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > t
遍历
1-先序 2-中序 3-后序 0-返回 > 1
先序遍历: EIBJHDFAGC
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > T
遍历
1-先序 2-中序 3-后序 0-返回 > 2
中序遍历: JBHIEFADGC
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > t
遍历
1-先序 2-中序 3-后序 0-返回 > 3
后序遍历: JHBIAFCGDE
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 9
不正确的数据选项!
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > D
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 0
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 1
结点数: 10
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > D
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 2
叶子结点数: 4
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 3
分枝结点数: 6
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 4
深度: 4
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > c
清空
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > O
输出:
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 1
结点数: 0
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > i
输入: ABD##E##CF##G##
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > o
输出:
G
C
F
A
E
B
D
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > d
数据
1-结点数 2-叶子结点数 3-分枝结点数 4-深度 0-返回 > 1
结点数: 7
I-输入 O-输出 C-清空 T-遍历 D-数据 Q-退出 > Q