输入样例1(对应图1):
8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -
输出样例1:
Yes
输入样例2(对应图2):
8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4
输出样例2:
No
8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -
输出样例1:
Yes
输入样例2(对应图2):
8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4
输出样例2:
No
题目分析:这道题猛的一看还是挺复杂的,因为不知道怎样组织一个合适的数据结构,但是走出第一步:设计一个数据结构,接下来的事情慢慢就容易了,很多小算法都是重复指令集,所以走出第一步,就成功了一半。
抛开具体的实现方法,但从数学上考虑这个问题:存在A,B两棵树,问A, B是否同构?关于树的算法首先是用递归的思路,所以本题的关键在于怎样表示一棵树。
代码如下:
/*************************************************************************> File Name: trIsom.c> Author: > Mail: > Created Time: 2016年12月26日 星期一 20时55分43秒************************************************************************/#include<stdio.h>#define MaxTree 10
#define Null -1
typedef char ElementType;
typedef int Tree;//a good data structure is a good begin for solution
struct TreeNode {ElementType Element;Tree Left;Tree Right;
};Tree BuildTree(struct TreeNode T[])
{int N;char cl, cr;int i;int check[MaxTree] = {0};int ch;scanf("%d", &N);ch = getchar();if (N) {for (i = 0; i < N; i++) {scanf("%c %c %c", &T[i].Element, &cl, &cr);ch = getchar();if (cl != '-') {T[i].Left = cl - '0';check[cl-'0'] = 1;} else {T[i].Left = Null;}if (cr != '-') {T[i].Right = cr - '0';check[cr-'0'] = 1;} else {T[i].Right = Null;}}} else {return -1;}for (i = 0; i < N; i++) {if (check[i] == 0) {break;}}return i;
}int Isomorphic(Tree R1, Tree R2, struct TreeNode* T1, struct TreeNode* T2)
{if (R1==Null && R2==Null) {return 1;}if ((R1==Null && R2!=Null) || (R1!=Null && R2==Null)) {return 0;}if (T1[R1].Element != T2[R2].Element) {return 0;} else {return (Isomorphic(T1[R1].Left, T2[R2].Left, T1, T2) && Isomorphic(T1[R1].Right, T2[R2].Right, T1, T2)) ||(Isomorphic(T1[R1].Right, T2[R2].Left, T1, T2) && Isomorphic(T1[R1].Left, T2[R2].Right, T1, T2));}
}int main()
{struct TreeNode T1[MaxTree], T2[MaxTree]; //construct 2 treesTree R1, R2;R1 = BuildTree(T1);R2 = BuildTree(T2);printf("%s\n", Isomorphic(R1, R2, T1, T2) ? "Yes" : "No");return 0;
}