详见:sdut3340
关于解题的思路(建议先看看浙大的网课):
1.如何构建二叉树(数组模拟)
2.如何求根(标记数组处理的)
3.如何判断树的同构(重中之重,思路必须清晰,1.空树(1or2),2.(树根值不等)3.(左子树为空)4.(左子树不空,两树的的值不等)5.(两树的值相等))
代码我是参考陈越老师的网课写的:
#include <bits/stdc++.h>
using namespace std;
typedef char elemtype;
typedef struct node
{
elemtype data;
int l,r;
} Tree ;
Tree t[15];
Tree tt[15];
int CMP(int s,int d);//*************
//求根可用标记数组,更为简单
//改用标记数组。
int BuildTree(Tree t[],int n)
{
char q[10],w[10],e[10];
int check[150];
memset(check,0,sizeof(check));
int i;
for(i=0; i<n; i++)
{
scanf("%s%s%s",q,w,e);
t[i].data=q[0];
if(w[0]=='-')
t[i].l=-1;
else
{
t[i].l=w[0]-'0';
check[t[i].l]=1; //标记下标已用
}
if(e[0]=='-')
t[i].r=-1;
else
{
t[i].r=e[0]-'0';
check[t[i].r]=1;
}
}
int s=-1;
for(i=0;i<n;i++)
if(check[i]==0)
{
s=i;
break;
}
return s;
}
int main()
{
int n,m,i,j,k;
while (~scanf("%d",&n))
{
int root,Root;
root=BuildTree(t,n);
scanf("%d",&m);
Root=BuildTree(tt,m);
if(CMP(root,Root))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
int CMP(int s,int d)//**************
{
if(s==-1&&d==-1) // 两棵空树
return 1;
if(s==-1&&d!=-1||s!=-1&&d==-1)//一棵空树
return 0;
//两棵树同时不为空
if (t[s].data!=tt[d].data)//两树值不等
return 0;
//左子树为空
if(t[s].l==-1&&tt[d].l==-1)
return CMP(t[s].r,tt[d].r);
//左子树不空 1.值相同 2. 不同
if((t[s].l!=-1)&&(tt[d].l!=-1)&&(t[t[s].l].data==tt[tt[d].l].data))//***************
return (CMP(t[s].l,tt[d].l)&&CMP(t[s].r,tt[d].r));
else
return (CMP(t[s].l,tt[d].r)&&CMP(t[s].r,tt[d].l));
}