这篇博客不是为了解释该题如何去做,这个题的方法哪里都有,我想说在写这道题的时候,发现很多写法的错误都是由于编译器版本不同造成的,也有粗心造成的:
- 没有bool类型需要引入 ”stdbool.h“ 头文件
- 为了安全需要输入函数为scanf_s,
- 输入一个字符时,scanf_s与scanf不相同等等,反正心态被搞炸了。。。
- 还有最恶心的:输入时一行一行输入,而scanf_s中在接受每一行的输入的结束时必须写一个 \n
我对于c语言的scanf_s的用法不太了解,看来得先了解一波了
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct BT {
char Element;
int left;
int right;
}T1[10], T2[10];
int BuildTree(struct BT T[]) {
int N;
char left, right;
scanf("%d\n", &N);
int check[10];
if (N) { //当不为空树的时候
for (int i = 0;i < N;i++) {
scanf("%c %c %c\n", &T[i].Element, &left, &right);
if (left != '-') {//左结点不为空
T[i].left = left - '0';
check[T[i].left] = 1;
}
else {
T[i].left = -1;
}
if (right != '-') {
T[i].right = right - '0';
check[T[i].right] = 1;
}
else {
T[i].right = -1;
}
check[i] = 0;
}//此时输入完毕,接下来找根结点
for (int i = 0;i < N;i++) {
if (check[i] == 0)
return i;
}
}
return -1;
}
bool Isomorphic(struct BT T1[], int t1, struct BT T2[], int t2) {
if (t1 == -1 && t2 == -1)//都为空
return true;
if ((t1 == -1 || t2 == -1))//一个空另一个不空
return false;
if (T1[t1].Element != T2[t2].Element)//根节点不同
return false;
if (T1[t1].left == -1 && T2[t2].left == -1)//根无左结点,则找到跟的右结点
return Isomorphic(T1, T1[t1].right, T2, T2[t2].right);
if ((T1[t1].left != -1 && T2[t2].left != -1) && T1[T1[t1].left].Element == T2[T2[t2].left].Element)//左结点相同
return (Isomorphic(T1, T1[t1].left, T2, T2[t2].left) && Isomorphic(T1, T1[t1].right, T2, T2[t2].right));
else//同构时,左结点与右结点相同时
return (Isomorphic(T1, T1[t1].left, T2, T2[t2].right) && Isomorphic(T1, T1[t1].right, T2, T2[t2].left));
}
int main() {
int t1 = BuildTree(T1);
//printf("t1 = %d\n", t1);
int t2 = BuildTree(T2);
//printf("t2 = %d\n", t2);
if (Isomorphic(T1, t1, T2, t2))
printf("Yes\n");
else
printf("No\n");
return 0;
}
结尾:
还有一个挺迷的东西:
在main函数里如果提前输出一个t1时,就会发现当你按照样例输入的时候程序不会结束,而是还在等待你再输入一行。。。
int t1 = BuildTree(T1);
printf("t1 = %d\n", t1);
int t2 = BuildTree(T2);
不知道为什么,对于scanf_s我是知道这个安全的,好像现在的编译器都只支持scanf_s(记得有一段时间是scanf和scanf_s都支持),但是不知道为什么PTA的编译版本任然支持且只支持 scanf,可能是编译器是dev c++(???猜测),还是希望可以统一吧,毕竟scanf_s安全。(超小声bb)
更新:对于多行输入,需要再scanf_s中加入\n
如果不加 \n ,当a b在一行输入结束后,按下回车,使得c变量接受的是回车键(所以输出时会有两行)
注意画蓝线的地方有空格
原因:
在格式串中定义的非类型控制符,那么相应的在输入时也要输入这个字符
所以scanf_s中有\n,我们在输入的时候才会多行输入
也正是因为这个原因,在上面第二张图里面蓝色部分会有个空格
如何在VS2019中使用scanf:
#define _CRT_SECURE_NO_WARNINGS//为了可以使用scanf
加上上面这段代码就可以啦。。。