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;
}