树 是否 同构
写的有点长,但大多写一半另一半复制就行了
这里不需要重新建树,因为是 2叉树比较简单,只需要判断每个结点的两个孩子是不是相同就行了,
结构体储存
(注: 博客作为交流使用,请勿抄袭应付作业)
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <climits>
using namespace std;
typedef long long ll;
const int maxn = 10 + 7, INF = 0x3f3f3f3f, mod = 1e9 + 7;
int n, m;
struct node {
int id;
char c;
int l, r;
char l_, r_;
}a[maxn], b[maxn];
bool cmp(node a, node b) {
return a.c < b.c;
}
int init() {
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
char c, l, r;
scanf("%c %c %c", &c, &l, &r); getchar();
//cout << c << " " << l << " " << r << endl;
a[i].c = c;
if(l == '-') a[i].l = -1;
else a[i].l = l - '0';
if(r == '-') a[i].r = -1;
else a[i].r = r - '0';
a[i].id = i;
}
scanf("%d", &m); if(n != m) return 0*puts("No");
getchar();
for(int i = 0; i < m; ++i) {
char c, l, r;
scanf("%c %c %c", &c, &l, &r); getchar();
//cout << c << " " << l << " " << r << endl;
b[i].c = c;
if(l == '-') b[i].l = -1;
else b[i].l = l - '0';
if(r == '-') b[i].r = -1;
else b[i].r = r - '0';
b[i].id = i;
}
return 1;
}
int solve() {
for(int i = 0; i < n; ++i) {
if(a[i].l == -1) a[i].l_ = '-';
else a[i].l_ = a[a[i].l].c;
if(a[i].r == -1) a[i].r_ = '-';
else a[i].r_ = a[a[i].r].c;
}
sort(a, a+n, cmp);
for(int i = 0; i < m; ++i) {
if(b[i].l == -1) b[i].l_ = '-';
else b[i].l_ = b[b[i].l].c;
if(b[i].r == -1) b[i].r_ = '-';
else b[i].r_ = b[b[i].r].c;
}
sort(b, b+n, cmp);
for(int i = 0; i < n; ++i) {
if(a[i].c != b[i].c) return 0*puts("No");
if( !((a[i].l_ == b[i].l_ && a[i].r_ == b[i].r_) || ((a[i].l_ == b[i].r_ && a[i].r_ == b[i].l_))) ) return 0*puts("No");
}
return 1*puts("Yes");
}
int main() {
if( !init()) return 0;
if( !solve()) return 0;
return 0;
}