两棵树如果是同构的,无论左右子树怎么旋转,子树的父节点是不会改变的,那么可以判断两棵树所有节点的父节点是否来判断是否同构。
#include <bits/stdc++.h>
using namespace std;
struct node//节点
{
char data=0;//节点自己的字母
char fa=0;//父节点的字母
}nd1[11],nd2[11];
bool cmp(node a,node b)
{
return a.data<b.data;
}
int main()
{
char d1[11],d2[11],f,l,r;//d1,d2记录节点的字母
int n1,n2,fa1[11],fa2[11];//fa1,fa2记录节点的父节点编号
for(int i=0;i<11;i++)
{
//将所有节点的父节点编号初始化为10,因为根节点没有父节点
//如果一个节点的父节点编号为10,那么就是根节点
fa1[i]=fa2[i]=10;
}
d1[10]=d2[10]=0;
//输入第一棵树
cin>>n1;
for(int i=0;i<n1;i++)
{
cin>>f>>l>>r;
d1[i]=f;
if(l!='-')
{
fa1[l-'0']=i;
}
if(r!='-')
{
fa1[r-'0']=i;
}
}
//输入第二棵树
cin>>n2;
for(int i=0;i<n2;i++)
{
cin>>f>>l>>r;
d2[i]=f;
if(l!='-')
{
fa2[l-'0']=i;
}
if(r!='-')
{
fa2[r-'0']=i;
}
}
//判断是否同构
if(n1!=n2) printf("No");
else
{
//将节点信息存储在结构体中
for(int i=0;i<n1;i++)
{
nd1[i].data=d1[i];
nd1[i].fa=d1[fa1[i]];
nd2[i].data=d2[i];
nd2[i].fa=d2[fa2[i]];
}
//按照节点字母进行排序
sort(nd1,nd1+n1,cmp);
sort(nd2,nd2+n2,cmp);
int flag=1;
for(int i=0;i<n1;i++)
{
if(nd1[i].data!=nd2[i].data||nd1[i].fa!=nd2[i].fa)
{
flag=0;
break;
}
}
if(flag) printf("Yes");
else printf("No");
}
return 0;
}