原题链接
首先要明白题目中的同构是什么意思?简单来说就是每个节点有相同的孩子,或者是说每个节点有相同的parent。这里只说第一种判定的代码。
易错点
①n有可能为零,所以有可能整棵树为空要判定。
int flag[20];///用来找根节点
struct Node
{
int l, r;char e;
}node1[20], node2[20];
int buildtree(struct Node *node)
{
memset(flag,0,sizeof(flag));
int n, root = -1;
cin>>n;getchar();
if(!n)return -1;
for(int i = 0;i < n;i++)
{
string s;
getline(cin,s);
node[i].e = s[0];
if(s[2] == '-')
node[i].l = -1;
else
node[i].l = s[2]-'0';
if(s[4] == '-')
node[i].r = -1;
else
node[i].r = s[4]-'0';
if(s[2] != '-')
flag[s[2]-'0'] = 1;
if(s[4] != '-')
flag[s[4]-'0'] = 1;
}
for(int i = 0;i < n;i++)
if(!flag[i])
{
root = i;
break;//没被标记过的就是根节点
}
return root;
}
bool judge_(int r1, int r2)
{
if(r1 == -1&&r2 == -1)///本节点为空
return 1;
if((r1 == -1&&r2 != -1)||(r1 != -1&&r2 == -1))///一个为空另一个不为
return 0;
if(node1[r1].e != node2[r2].e)///本身元素都不相同
return 0;///边界条件和判定
(judge_(node1[r1].l,node2[r2].l)&&judge_(node1[r1].r,node2[r2].r)||judge_(node1[r1].l,node2[r2].r)&&judge_(node1[r1].r,node2[r2].l));
}///这时两种情况
///A树左子树与B树左子树同构且A树右子树与B树右子树同构
///A树左子树与B树右子树同构且A树右子树与B树左子树同构
int main()
{
int r1, r2;
r1 = buildtree(node1);
r2 = buildtree(node2);
if(judge_(r1, r2))
cout << "Yes";
else
cout <<"No";
}