Two trees, T1
and T2
, are isomorphic if T1
can be transformed into T2
by swapping left and right children of (some of the) nodes in T1
. 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. Give a polynomial time algorithm to decide if two trees are isomorphic.
Figure 1
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
Figure2
具体代码实现为:
int Isomorphic(Tree T1,Tree T2)
{
if((T1 == NULL) && (T2 == NULL)) //树都为空树,视为同构
return 1;
if(((T1 == NULL)&&(T2 != NULL)) || ((T1 != NULL)&&(T2 == NULL))) //两树其中之一为空树,不同构
return 0;
if(T1->Element != T2->Element) //若两树都非空的话,比较根结点
return 0;
if((T1->Left == NULL) && (T2->Left == NULL)) //左子树都为空,比较右子树
return Isomorphic(T1->Right,T2->Right);
if((T1->Left != NULL)&&(T2->Left != NULL) && (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));
}