#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20
#define YES 1
#define NO 0
struct TreeNode
{
char data;
int leftSon,rightSon;
}Tree1[MAX_SIZE],Tree2[MAX_SIZE];
int buildTree(struct TreeNode Tree[])
{
int n,i,root;
char left,right;
char ch;
printf("输入节点个数:");
scanf("%d",&n);
ch=getchar();
int check[n];
if(n==0)
{
root=-1;
return root;
}
for(i=0;i<n;i++)
{
check[i]=0;
}
printf("输入节点信息:\n");
for(i=0;i<n;i++)
{
scanf("%c%c%c",&Tree[i].data,&left,&right);
ch=getchar();//多个输入时,用getchar吸回车!!!!!
if(left!='-')
{
Tree[i].leftSon=left-'0';//字符转数字
check[Tree[i].leftSon]=1;
}
else
{
Tree[i].leftSon=-1;//没有左孩子,就把左孩子置为-1
}
if(right!='-')
{
Tree[i].rightSon=right-'0';
check[Tree[i].rightSon]=1;
}
else
{
Tree[i].rightSon=-1;
}
}
for(i=0;i<n;i++)//找根节点
{
if(check[i]==0)
{
root=i;
break;
}
}
printf("%d",root);
return root;//返回根
}
int isomorphism(int root1,int root2)
{
if((root1==-1)&&(root2==-1))//两个根都是空的
{
return 1;
}
if((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1))//一个根为空,一个不为空
{
return 0;
}
if(Tree1[root1].data!=Tree2[root2].data)//根节点的数据不同
{
return 0;
}
/*上面好理解*/
if((Tree1[root1].leftSon==-1)&&(Tree2[root2].leftSon==-1))//根的两个左孩子都空
{
return isomorphism(Tree1[root1].rightSon,Tree2[root2].rightSon);
}
if((Tree1[root1].leftSon!=-1&&Tree2[root2].leftSon!=-1)&&(Tree1[Tree1[root1].leftSon].data==Tree2[Tree2[root2].leftSon].data))//两棵树根的左孩子都不为空 ,且两棵树左子数的数据相同
{
return isomorphism(Tree1[root1].leftSon,Tree2[root2].leftSon)&&isomorphism(Tree1[root1].rightSon,Tree2[root2].rightSon);
}
else//1.一棵树根的左孩子为空,另一颗根的左孩子不为空 2.一棵树根的左子树是另一棵树根的右子树
{
return isomorphism(Tree1[root1].leftSon,Tree2[root2].rightSon)&&isomorphism(Tree1[root1].rightSon,Tree2[root2].leftSon);//两棵树的左右 右左分别比较
}
}
int main()
{
int root1,root2;
printf("创建第一棵树:\n");
root1=buildTree(Tree1);
printf("创建第二棵树:\n");
root2=buildTree(Tree2);
if(isomorphism(root1,root2))
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
二叉树同构
最新推荐文章于 2022-08-08 01:04:55 发布