PTA 树的同构

    xiaoxiao2021-03-25  105

    给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

    图1

    图2

    现给定两棵树,请你判断它们是否是同构的。

    输入格式:

    输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NN (\le 1010),即该树的结点数(此时假设结点从0到N-1N1编号);随后NN行,第ii行对应编号第ii个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

    输出格式:

    如果两棵树是同构的,输出“Yes”,否则输出“No”。

    输入样例1(对应图1):

    8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 -

    输出样例1:

    Yes

    输入样例2(对应图2):

    8 B 5 7 F - - A 0 3 C 6 - H - - D - - G 4 - E 1 - 8 D 6 - B 5 - E - - H - - C 0 2 G - 3 F - - A 1 4

    输出样例2:

    No

    解题思路:若所有值相同的节点的父亲节点相同,那么这两棵树同构,若对于一个节点,在另一棵树上找不到相同值得节点,那么必然不同构

    #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <set> #include <stack> #include <map> #include <climits> #include <functional> using namespace std; #define LL long long const int INF=0x3f3f3f3f; char s1[15][2]; char s2[15][2]; int n,m; int f1[20],f2[20]; char ch1[2],ch2[2],ch3[2]; int main() { while(~scanf("%d",&n)) { for(int i=0;i<=n;i++) f1[i]=-1; for(int i=0;i<n;i++) { scanf("%s%s%s",ch1,ch2,ch3); strcpy(s1[i],ch1); if(strcmp(ch2,"-")) { int a=0,len=strlen(ch2); for(int j=len-1;j>=0;j--) a=a*10+ch2[j]-'0'; f1[a]=i; } if(strcmp(ch3,"-")) { int a=0,len=strlen(ch3); for(int j=len-1;j>=0;j--) a=a*10+ch3[j]-'0'; f1[a]=i; } } scanf("%d",&m); for(int i=0;i<=m;i++) f2[i]=-1; for(int i=0;i<m;i++) { scanf("%s%s%s",ch1,ch2,ch3); strcpy(s2[i],ch1); if(strcmp(ch2,"-")) { int a=0,len=strlen(ch2); for(int j=len-1;j>=0;j--) a=a*10+ch2[j]-'0'; f2[a]=i; } if(strcmp(ch3,"-")) { int a=0,len=strlen(ch3); for(int j=len-1;j>=0;j--) a=a*10+ch3[j]-'0'; f2[a]=i; } } if(n!=m) {printf("No\n");continue;} int flag=1; char x[2],y[2],a[2],b[2]; for(int i=0;i<n;i++) { strcpy(x,s1[i]); int j; for(j=0;j<m;j++) { strcpy(y,s2[j]); if(!strcmp(x,y)) { if(f1[i]==-1&&f2[j]==-1) break; else if(f1[i]==-1||f2[j]==-1) {flag=0;break;} else { strcpy(a,s1[f1[i]]); strcpy(b,s2[f2[j]]); if(strcmp(a,b)) flag=0; break; } } } if(j>=m) flag=0; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-24293.html

    最新回复(0)