#include <bits/stdc++.h>
#define Null -1
using namespace std;
struct Tree
{
char data;
int left;
int right;
} T1[15], T2[15];
int judge(int r1, int r2);
int CreatTree(Tree T[], int n);
int main()
{
int n;
int r1, r2;
while(cin >> n)
{
r1 = CreatTree(T1, n);
cin >> n;
r2 = CreatTree(T2, n);
if(judge(r1, r2)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
int CreatTree(Tree T[], int n)
{
int root = -1;
char r[10], l[10], data[10];
int check[15];
memset(check, 0, sizeof(check));
if(n)
{
for(int i = 0; i < n; i++)
{
scanf("%s %s %s", data, l, r);
T[i].data = data[0];
if(l[0] != '-')
{
T[i].left = l[0]-'0';
check[T[i].left] = 1;
}
else T[i].left = Null;
if(r[0] != '-')
{
T[i].right = r[0]-'0';
check[T[i].right] = 1;
}
else T[i].right = Null;
}
for(int i = 0; i < n; i++)
{
if(!check[i])
{
root = i;
break;
}
}
}
return root;
}
int judge(int r1, int r2)
{
if(r1 == Null && r2 == Null)
return 1;
if((r1 == Null && r2 != Null) || (r1 != Null && r2 == Null))
return 0;
if(T1[r1].data != T2[r2].data)
return 0;
if((T1[r1].left == Null) && (T2[r2].left == Null))
return judge(T1[r1].right,T2[r2].right);
if((T1[r1].left != Null && T2[r2].left != Null) &&
(T1[T1[r1].left].data == T2[T2[r2].left].data))
return (judge(T1[r1].left, T2[r2].left) && judge(T1[r1].right, T2[r2].right));
else return (judge(T1[r1].left, T2[r2].right) && judge(T1[r1].right, T2[r2].left));
}
SDUT 3340 数据结构实验之二叉树一:树的同构
最新推荐文章于 2022-03-18 09:56:39 发布