链接: 题目链接
解析:
先建树,然后按照二叉树的性质看,首先如果父节点相同,比较他的两个子节点,左面等于左面且右面等于右面,或者左面等于右面切且右面等于左面。
如果发现没有相同的父节点,直接break;
#include <bits/stdc++.h>
using namespace std;
struct node {
char data;
int l, r;
} a[60], b[60];
int n, m;
void create(struct node *t, int m) {
int i;
char s[10];
for (i = 0; i < m; i++) {
scanf("%s", s);
t[i].data = s[0];
scanf("%s", s);
if (s[0] == '-')
t[i].l = 11;
else
t[i].l = s[0] - '0';
scanf("%s", s);
if (s[0] == '-')
t[i].r = 11;
else
t[i].r = s[0] - '0';
}
}
int c(int i, int j) {
if (a[a[i].l].data == b[b[j].l].data && a[a[i].r].data == b[b[j].r].data) {
return 1;
}
if (a[a[i].l].data == b[b[j].r].data && a[a[i].r].data == b[b[j].l].data)
return 1;
return 0;
}
int c2() {
int i, j;
int flag = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if (a[i].data == b[j].data) {
if (c(i, j) == 0) {
flag = 1;
break;
} else
break;
}
}
if (j == m) {
flag = 1;
break;
}
}
return flag;
}
int main() {
while (~scanf("%d", &n)) {
create(a, n);
scanf("%d", &m);
create(b, m);
if (n != m)
printf("No\n");
else if (c2())
printf("No\n");
else
printf("Yes\n");
}
return 0;
}