4-11 Isomorphic (10分)
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 inT1
. 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.
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
andT2
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
思路:
一开始想的复杂了,看过韩旭051的代码,大佬就是大佬!!!
递归思想永远的神,想好了问题基础的解题思路后,其他一层层深入的烦恼全部抛给递归就行了
那么这道题怎么想呢?如果T1,T2全是NULL,是不是代表着当前的两个结点一定相等;如果T1,T2其中只有一个是NULL,或者两个结点的值不相等,是不是代表着当前两个结点一定不相等。
基础的思路就是这样,之后交给递归去进行:无非就是继续比较当前两个结点各自的左与左、右与右孩子;或者进行一个交换,比较两个结点的左与右孩子,右与子孩子。
AC代码:
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));
}