4-11 Isomorphic (10分)
Two trees,
T1
andT2
, are isomorphic ifT1
can be transformed intoT2
by swapping left and right children of (some of the) nodes inT1
.
如果T1可以通过交换(某些)结点的左右子结点将其转换为T2,那么T1、T2这两棵树就是同构的
For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not the other nodes, are swapped.
例如,图一中的两棵树是同构的,因为交换A、B、G的子结点而不是其它结点它们是同构的
Give a polynomial time algorithm to decide if two trees are isomorphic.
给出一个多项式时间算法来确定两棵树是否同构
Format of functions:
int Isomorphic( Tree T1, Tree T2 );
where Tree is defined as the following:
typedef struct TreeNode *Tree;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
The function is supposed to return 1
if T1 and T2 are indeed isomorphic, or 0
if not.
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TreeNode *Tree;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
Tree BuildTree(); /* details omitted */
int Isomorphic( Tree T1, Tree T2 );
int main()
{
Tree T1, T2;
T1 = BuildTree();
T2 = BuildTree();
printf(“%d\n”, Isomorphic(T1, T2));
return 0;
}
/* Your function will be put here */
Sample Output 1 (for the trees shown in Figure 1):
1
Sample Output 2 (for the trees shown in Figure 2):
0
代码如下:
配合浙大DSMOOC小白专场 — 同构的判断效果更佳
int Isomorphic(Tree T1,Tree T2){
if(!T1&&!T2) return 1; //如果为空树则是同构的
if((!T1&&T2)||(T1&&!T2)) return 0; //如果一个为空一个不为空则不是同构的
if((T1->Element)!=(T2->Element)) return 0;//如果数据不同则不是同构的
//如果左儿子都为空判断右儿子是否同构:主要看以上三个方面(1)右儿子是否都为空(2)是否一个有右儿子一个没有(3)右儿子数据是否相同
if(!T1->Left&&!T2->Left) return Isomorphic(T1->Right,T2->Right);
if((T1->Left&&T2->Left)&&(T1->Left->Element==T2->Left->Element)) return Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right); //如果两棵树左儿子都不为空并且数据还是一样的,对左儿子进行递归
else return Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left); //如果两棵树左儿子(一个空一个不空或者都不空)并且数据不一样,那么判断第一棵树的左(右)儿子是否跟第二棵树的右(左)儿子同构
}
简写版
int Isomorphic( Tree T1, Tree T2 ){
if(!T1&&!T2) return 1;
if(!T1&&T2||T1&&!T2||T1->Element!=T2->Element) return 0;
return Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right)||Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left);
}