先找出没有父节点的一个一个节点即为树的根节点,用队列和递归顺序构造二叉树,然后再用两个队列把两棵树相同的数据存进两个队列,保证弹出来的数据是一样的,再暴力判断其左右节点的同构性,本来是用左右节点相加的值得思想判断的,但水平有限,不知道如何保存子树的子树,于是就放弃了,使用了这个超长的代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct node{
char pp;
struct node *left;
struct node *right;
struct node *tt;
int x;
}u,v,u2,v2;
queue<node>q;
struct node* creattree(int n){
if(n==0){
return NULL;
}
int i,k;
int biaoji[11];
memset(biaoji,0,sizeof(biaoji));
char a[11],b[11],c[11];
//cin>>n;
for(i=0;i<n;i++){
cin>>a[i]>>b[i]>>c[i];
if(b[i]!='-'){
biaoji[b[i]-'0']=1;
}
if(c[i]!='-') biaoji[c[i]-'0']=1;
}
for(i=0;i<n;i++){
if(biaoji[i]==0){
k=i;
break;
}
}
node* T=new node;
T->pp=a[k];
T->left=NULL;
T->right=NULL;
node *q1=new node;
q1=T;
u.x=k;
u.tt=q1;
q.push(u);
while(!q.empty()){
u=q.front();
q.pop();
q1=u.tt;
k=u.x;
if(b[u.x]!='-'){
node* p=new node;
p->pp=a[b[k]-'0'];
p->left=NULL;
p->right=NULL;
q1->left=p;
v.x=b[u.x]-'0';
v.tt=p;
q.push(v);
}
if(c[u.x]!='-'){
node* p1=new node;
p1->pp=a[c[k]-'0'];
p1->left=NULL;
p1->right=NULL;
q1->right=p1;
v.x=c[u.x]-'0';
v.tt=p1;
q.push(v);
}
}
return T;
}
int main()
{
struct node *T1,*T2;
int n,m;
cin>>n;
T1= creattree(n);
cin>>m;
T2= creattree(m);
if(n==0&&m==0){
cout<<"Yes"<<endl;
return 0;
}
if(n!=m){
cout<<"No"<<endl;
return 0;
}
if(T1->pp!=T2->pp){
cout<<"No"<<endl;
return 0;
}
struct node* p1=T1;
struct node* p2=T2;
queue<node>q2;
u.tt=p1;
u2.tt=p2;
q.push(u);
q2.push(u2);
int flag=1,sum1,sum2;
while(!q.empty()&&!q2.empty()){
sum1=0;sum2=0;
flag=1;
u=q.front();
q.pop();
u2=q2.front();
q2.pop();
p1=u.tt;
p2=u2.tt;
if(p1->left!=NULL){
v.tt=p1->left;
q.push(v);
}
if(p1->left!=NULL&&p2->left!=NULL&&p2->left->pp==p1->left->pp){
v2.tt=p2->left;
q2.push(v2);
}
if(p1->left!=NULL&&p2->right!=NULL&&p2->right->pp==p1->left->pp){
v2.tt=p2->right;
q2.push(v2);
}
if(p1->right!=NULL){
v.tt=p1->right;
q.push(v);
}
if(p1->right!=NULL&&p2->left!=NULL&&p2->left->pp==p1->right->pp){
v2.tt=p2->left;
q2.push(v2);
}
if(p1->right!=NULL&&p2->right!=NULL&&p2->right->pp==p1->right->pp){
v2.tt=p2->right;
q2.push(v2);
}
if(p1->left==NULL&&p1->right==NULL&&(p2->left!=NULL||p2->right!=NULL)){
flag=0;
break;
}
if(p2->left==NULL&&p2->right==NULL&&(p1->left!=NULL||p1->right!=NULL)){
flag=0;
break;
}
if(p1->left!=NULL&&p1->right==NULL&&(p2->left!=NULL&&p2->right==NULL)){
if(p1->left->pp!=p2->left->pp){
flag=0;
break;}
}
if(p1->left!=NULL&&p1->right==NULL&&(p2->left==NULL&&p2->right!=NULL)){
if(p1->left->pp!=p2->right->pp){
flag=0;
break;}
}
if(p1->left==NULL&&p1->right!=NULL&&(p2->left==NULL&&p2->right!=NULL)){
if(p1->right->pp!=p2->right->pp){
flag=0;
break;}
}
if(p1->left==NULL&&p1->right!=NULL&&(p2->left!=NULL&&p2->right==NULL)){
if(p1->right->pp!=p2->left->pp){
flag=0;
break;}
}
if(p1->left!=NULL&&p1->right!=NULL&&p2->left!=NULL&&p2->right!=NULL){
sum1=p1->left->pp+p1->right->pp;
sum2=p2->left->pp+p2->right->pp;
if(sum1!=sum2){
flag=0;
break;}
}
if(p1->left!=NULL&&p1->right!=NULL&&p2->left!=NULL&&p2->right==NULL){
flag=0;
break;
}
if(p1->left==NULL&&p1->right!=NULL&&p2->left!=NULL&&p2->right!=NULL){
flag=0;
break;
}
}
if(!q.empty()||!q2.empty()){
cout<<"No"<<endl;
return 0;
}
if(flag==1){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
return 0;
}