7-3 樹的同構 (25 分)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章