#include<stdio.h>
#define N 10
struct TreeNode{
char ele;
int left,right; //左右儿子结点
}T1[N],T2[N];
int Build_Tree(struct TreeNode T[]) //建树
{
int check[N]={0}; //用于判断该结点是否为根节点,初始化为0
char cl,cr;
int n,root=-1; //根节点root 初始化为-1(空树情况下)
scanf("%d",&n);
getchar(); //!!!记得读取回车 不然后面的读取会出现问题
for(int i=0;i<n;i++)check[i]=0;
for(int i=0;i<n;i++)
{
scanf("%c %c %c",&T[i].ele,&cl,&cr);
getchar();
T[i].left=cl=='-'?-1:cl-'0';
T[i].right=cr=='-'?-1:cr-'0';
//如果左右儿子存在,那么左右儿子结点更新为1,因为根节点不可能作为左右儿子存在
if(cl!='-')check[cl-'0']=1;
if(cr!='-')check[cr-'0']=1;
}
for(int i=0;i<n;i++) //遍历根结点
{
if(check[i]==0)
{
root=i;
}
}
return root; //空树时候root不会更新,为-1返回
}
int Isomorphic(int R1,int R2) //函数中判断两棵树的多种情况
{
if(R1==-1&&R2==-1) //1.都为空树->同构
{
return 1;
}
if(((R1==-1)&&(R2!=-1))||((R1!=-1)&&(R2==-1))) //2.一棵空一棵非空->非同构
{
return 0;
}
if(T1[R1].ele!=T2[R2].ele)return 0; //3.根节点不同->非同构
if(T1[R1].left==-1&&T2[R2].left==-1) //4.左子树都空(只有右子树or只有根结点)
{
return Isomorphic(T1[R1].right,T2[R2].right); //递归判断右子树的情况
}
if(((T1[R1].left!=-1)&&(T2[R2].left!=-1))&&((T1[T1[R1].left].ele)==(T2[T2[R2].left].ele))) //5.左子树都非空并且左子树结点相同
{
//分别递归比较左子树和右子树
return Isomorphic(T1[R1].left,T2[R2].left)&&Isomorphic(T1[R1].right,T2[R2].right);
}
else //6.左子树都非空并且左子树结点不同or有一棵树的左空而另一棵非空
{
//判断左右子树换位后的情况是否成立
return Isomorphic(T1[R1].left,T2[R2].right)&&Isomorphic(T1[R1].right,T2[R2].left);
}
}
int main()
{
int R1=Build_Tree(T1);
int R2=Build_Tree(T2);
int n=Isomorphic(R1,R2);
if(n)
printf("Yes");
else
printf("No");
}