题目描述
输入样例每行代表第i个节点(0 <= i < n-1),字母表示数据域的值,数字代表其子树的根节点是第几个节点
#include <stdio.h>
#include <stdlib.h>
#define N 15
#define null -1
typedef struct TreeNode//二叉树节点
{
char data;
int lchild;
int rchild;
}BITREE;
BITREE tree1[N],tree2[N];
int CreateTree(BITREE tree[],int n)//创建二叉树
{
int i=-1;
char dt,lc,rc;
int check[N]={0};
if(n)
{
for(i=0;i<n;i++)
{
scanf(" %c %c %c",&dt,&lc,&rc);
getchar();
tree[i].data=dt;
if(lc!='-')
{
tree[i].lchild=(int)(lc-'0');
check[tree[i].lchild]=1;
}
else
tree[i].lchild=null;
if(rc!='-')
{
tree[i].rchild=(int)(rc-'0');
check[tree[i].rchild]=1;
}
else
tree[i].rchild=null;
}
for(i=0;i<n;i++)
if(!check[i])
break;
}
return i;
}
int Isomorphic(int r1,int r2) //根据两树根节点判断是否同构
{
if(r1==null && r2==null) //两节点为空
return 1;
if((r1==null && r2!=null) || (r1!=null && r2==null)) //两节点一空一非空
return 0;
if(tree1[r1].data != tree2[r2].data) //两节点值不等
return 0;
if(tree1[r1].lchild==null && tree2[r2].lchild==null) //两节点都无左子树
return ( Isomorphic(tree1[r1].rchild,tree2[r2].rchild) );
if(tree1[r1].lchild!=null && tree2[r2].lchild!=null && tree1[tree1[r1].lchild].data == tree2[tree2[r2].lchild].data) //两节点左子树根节点值相等
return ( Isomorphic(tree1[r1].lchild,tree2[r2].lchild) && Isomorphic(tree1[r1].rchild,tree2[r2].rchild) );
else //进行左右孩子"交换"
return (Isomorphic(tree1[r1].lchild,tree2[r2].rchild) && Isomorphic(tree1[r1].rchild,tree2[r2].lchild));
}
int main()
{
int n;
int r1,r2;//root
scanf("%d",&n);
r1=CreateTree(tree1,n);
scanf("%d",&n);
r2=CreateTree(tree2,n);
if(Isomorphic(r1,r2))
printf("Yes");
else
printf("No");
return 0;
}