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.
如果T1可以通过交换T1中(一些)节点的左右子节点而转换为T2,那么T1和T2这两棵树是同构的。例如,图1中的两棵树就是同构的,因为如果交换了A、B和G的子节点而不是其他节点的子节点,它们是相同的。给出一个多项式时间算法来判断两棵树是否同构。
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.
如果T1和T2确实同构,则函数应该返回1,否则返回0。
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
代码:
int Isomorphic(Tree T1, Tree T2) {
if (T1 == NULL && T2 == NULL)
return 1;
else if (T1 == NULL || T2 == NULL || T1->Element != T2->Element)
return 0;
return
Isomorphic(T1->Left, T2->Left) && Isomorphic(T1->Right, T2->Right) || (Isomorphic(T1->Right, T2->Left) && Isomorphic(T1->Left, T2->Right));
}
递归方法:
如果两个树都是空树的时候,那么同构
if (T1 == NULL && T2 == NULL)
return 1;
因为上一个if语句判断了左右孩子都是空的情况,这里如果一个根节点是空,另外一个不为空,或者两个根节点的值不同,那么不是同构的
else if (T1 == NULL || T2 == NULL || T1->Element != T2->Element)
return 0;
同构的情况有两种,一种是交换了:
(Isomorphic(T1->Right, T2->Left) && Isomorphic(T1->Left, T2->Right))
一种是没交换的:
Isomorphic(T1->Left, T2->Left) && Isomorphic(T1->Right, T2->Right)
这两种情况 出现一种就行:
return
Isomorphic(T1->Left, T2->Left) && Isomorphic(T1->Right, T2->Right) || (Isomorphic(T1->Right, T2->Left) && Isomorphic(T1->Left, T2->Right));