题目
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
现给定两棵树,请你判断它们是否是同构的。
思路
建树A,B、对A每一个树结点,在树B中找到相应结点,比较其左右儿子是否相同
注意C语言char类型数据的输入
代码
typedef struct TreeNode*BinTree;
struct TreeNode{
char data;
int left;
int right;
};
void createTree(int N,struct TreeNode T[]){
char alpha;
char cl,cr;
int flag=0;
for(int i=0;i<N;i++){
if(flag==1) scanf("\n");
else flag=1;
scanf("%c %c %c",&alpha,&cl,&cr);
T[i].data=alpha;
if(cl=='-') T[i].left=-1;
else T[i].left=cl-'0';
if(cr=='-') T[i].right=-1;
else T[i].right=cr-'0';
}
}
int search(struct TreeNode T[],char alpha,int N){
for(int i=0;i<N;i++){
if(T[i].data==alpha) return i;}
return -1;/*没找到*/
}
int main()
{
int flag;
int N;
scanf("%d",&N);
if(N==0) flag=1;/*空树*/
else {
scanf("\n"); //一场\n引发的血案
struct TreeNode T1[N];
createTree(N,T1);
scanf("%d\n",&N);
struct TreeNode T2[N];
createTree(N,T2);
/*比较*/
for(int i=0;i<N;i++){
char alpha;
char left,right;
int _alpha;
char _left,_right;
alpha=T1[i].data;
if(T1[i].left==-1) left='-';
else left=T1[T1[i].left].data;
if(T1[i].right==-1) right='-';
else right=T1[T1[i].right].data;
_alpha=search(T2,alpha,N);
if(_alpha!=-1){ //在树2中找到对应点
if(T2[t2].left==-1) _left='-';
else _left=T2[T2[t2].left].data;
if(T2[t2].right==-1) _right='-';
else _right=T2[T2[t2].right].data;
if(((left!=_left)&&(left!=_right))||((right!=_right)&&(right!=_left))){flag=0;break;}
else flag=1; }
else flag=0; }
}
if(flag==0) printf("No");
else printf("Yes");
return 0;
}