版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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;
}