7-3 树的同构 (25 分)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44720323/article/details/101476851

7-3 树的同构 (25 分)


树的同构:这道题主要是能够读懂题意,给的数据中左右子树的编号是你输入数据时的编号,
例如:
A 1 2
他的意思是:
A的左子树是输入的编号为1的数据(就是输入的第二组数据)
A的右子树是输入的编号为2的数据(就是输入的第三组数据)
以此类推。。。

我不知道为什么在我电脑的编译器上sample 1 可以正确的输出Yes,但是上交PTA就显示答案错误。
希望有看到的小伙伴能帮我看一下吧。


现已解决, 解决方案在最下面。

下面是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node TreeNode;
struct Node{
	char name;
	char left;
	char right;
};

int main()
{
	int n;
	int i,j;
	int count = 0;//判断比配次数
	TreeNode *Anode,*Bnode;
	scanf("%d",&n);
	getchar();
	//动态分配
	Anode = (TreeNode*)malloc(sizeof(struct Node)*n);
	Bnode = (TreeNode*)malloc(sizeof(struct Node)*n);
	//输入
	for(i=0;i<n;i++){
		scanf("%c %c %c",&Anode[i].name,&Anode[i].left,&Anode[i].right);
		fflush(stdin);
	}
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++){
		scanf("%c %c %c",&Bnode[i].name,&Bnode[i].left,&Bnode[i].right);
		fflush(stdin);
	}
	//判断
	for(i=0;i<n;i++) //控制变化前的树
	{
		for(j=0;j<n;j++) //控制变化后的树
		{
			if(Anode[i].name == Bnode[j].name)
			{
				int Al,Ar,Bl,Br;
				Al = Anode[i].left - '0';
				Ar = Anode[i].right - '0';
				Bl = Bnode[j].left - '0';
				Br = Bnode[j].right - '0';
				//没有变化
				if(Al == -3 && Bl == -3 && Ar == -3 && Br == -3) break;

				else if(Al == -3 && Bl == -3 && \
					Anode[Ar].name == Bnode[Br].name) break;

				else if(Anode[Al].name == Bnode[Bl].name && \
					Ar == -3 && Br == -3) break;

				else if(Anode[Al].name == Bnode[Bl].name &&\
					Anode[Ar].name == Bnode[Br].name) break;
				//有变化
				else if(Al == -3 && Br == -3 && \
					Anode[Ar].name == Bnode[Bl].name) break;

				else if(Anode[Al].name == Bnode[Br].name && \
					Ar == -3 && Bl == -3) break;

				else if(Anode[Al].name == Bnode[Br].name &&\
					Anode[Ar].name == Bnode[Bl].name) break;

				else{
					printf("No\n");
					return 0;
				}
			}
		}
		//防止name不一样的情况
		if(j == n) {printf("No\n");return 0;}
	}
	printf("Yes\n");
    return 0;
}

在这里插入图片描述
在这里插入图片描述
现在成功的提交了,可能时PTA和我的编译器不大一样,我是用getchar()来处理换行符'\n',看了MOOC发现老师是用的scanf("%d\n")scanf("%c %c %c\n")来处理的换行符'\n'。然后我我修改了程序就成功了。

下面是AC代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct Node TreeNode;
struct Node{
	char name;
	char left;
	char right;
};

int main()
{
	int n;
	int i,j;
    int count = 0;
	TreeNode *Anode,*Bnode;
	
	/* 区别 */
	scanf("%d\n",&n);
	//动态分配
	Anode = (TreeNode*)malloc(sizeof(struct Node)*n);
	Bnode = (TreeNode*)malloc(sizeof(struct Node)*n);
	//输入
	for(i=0;i<n;i++){
	
		/* 区别 */
		scanf("%c %c %c\n",&Anode[i].name,&Anode[i].left,&Anode[i].right);
	//	fflush(stdin);
	}
	
	/* 区别 */
	scanf("%d\n",&n);
	for(i=0;i<n;i++){
	
		/* 区别 */
		scanf("%c %c %c\n",&Bnode[i].name,&Bnode[i].left,&Bnode[i].right);
	//	fflush(stdin);
	}
	//判断
	for(i=0;i<n;i++) //控制变化前的树
	{
		for(j=0;j<n;j++) //控制变化后的树
		{
			if(Anode[i].name == Bnode[j].name)
			{
				int Al,Ar,Bl,Br;
				Al = Anode[i].left - '0';
				Ar = Anode[i].right - '0';
				Bl = Bnode[j].left - '0';
				Br = Bnode[j].right - '0';
				//没有变化
				if(Al == Bl && Bl == Br && Br == Ar) break;

				else if(Al == Bl && Anode[Ar].name == Bnode[Br].name) break;

				else if(Anode[Al].name == Bnode[Bl].name && Ar == Br) break;

				else if(Anode[Al].name == Bnode[Bl].name &&\
					Anode[Ar].name == Bnode[Br].name) break;
				//有变化
				else if(Al == Br && Anode[Ar].name == Bnode[Bl].name) break;

				else if(Anode[Al].name == Bnode[Br].name && Ar == Bl) break;

				else if(Anode[Al].name == Bnode[Br].name &&\
					Anode[Ar].name == Bnode[Bl].name) break;
		
				else{
					printf("No\n");
					return 0;
				}
			}
		}
		if(j == n) {printf("No\n");return 0;}
	}
	printf("Yes\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44720323/article/details/101476851