PTA 树的同构 及 所引发的scanf_s与scanf输入问题

这篇博客不是为了解释该题如何去做,这个题的方法哪里都有,我想说在写这道题的时候,发现很多写法的错误都是由于编译器版本不同造成的,也有粗心造成的:

  1. 没有bool类型需要引入 ”stdbool.h“ 头文件
  2. 为了安全需要输入函数为scanf_s,
  3. 输入一个字符时,scanf_s与scanf不相同等等,反正心态被搞炸了。。。
  4. 还有最恶心的:输入时一行一行输入,而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

加上上面这段代码就可以啦。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值