L2-3 树的同构 (25分)

it2023-08-23  65

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 现给定两棵树,请你判断它们是否是同构的。 输入格式:

输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。 输出格式: 如果两棵树是同构的,输出“Yes”,否则输出“No”。 输入样例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

思路: 只需判断每一个子树互相是不是同构即可 判断根节点是否相同, 以及他们的子树两两之间是否存在一种组合使其能够互相同构 eg x 为根 xl, xr, 左右子树

y为根, yl, yr,左右子树 只需判断x 和 y 的值是否相同以及(xl 和 yl 同构 且xr和yr同构), 或者(xl和yr同构, 且 xr和yl同构) 此处说的同构和题目说的不一致, 即为根节点是否相同以及他们的后代能匹配相同的节点 具体看代码

#include<bits/stdc++.h> using namespace std; const int N = 100; int n; struct node { int l, r; char c; }a[100], b[100]; bool dfs(int x, int y) { //cout << a[x].c << " " << a[y].c << endl; //cout << x <<" " << y << "****" << endl; if(a[x].c != b[y].c) return false; if(a[x].l == 0 && a[x].r == 0) { if(b[y].l != 0 || b[y].r != 0) return false; else return true; } else if(a[x].l == 0 && a[x].r != 0) { if(b[y].l == 0 && b[y].r != 0) return dfs(a[x].r, b[y].r); else if(b[y].l != 0 && b[y].r == 0) return dfs(a[x].r, b[y].l); else return false; } else if(a[x].l != 0 && a[x].r == 0) { if(b[y].l == 0 && b[y].r != 0) return dfs(a[x].l, b[y].r); else if(b[y].l != 0 && b[y].r == 0) return dfs(a[x].l, b[y].l); else return false; } else { if(b[y].l == 0 || b[y].r == 0) return false; else { if(dfs(a[x].l, b[y].l) && dfs(a[x].r, b[y].r)) return true; if(dfs(a[x].l, b[y].r) && dfs(a[x].r, b[y].l)) return true; return false; } } } int main() { cin >> n; int num = ((n + 1)* n) / 2; int x1, y1, z1 = num; for(int i = 1; i <= n; i++) { getchar(); char c, x, y; scanf("%c %c %c", &c, &x, &y); if(x == '-') x = '0' - 1; if(y == '-') y = '0' - 1; a[i].c = c; a[i].l = x - '0' + 1; a[i].r = y - '0' + 1; z1 = z1 - a[i].l - a[i].r; } x1 = z1; z1 = num; int n1; cin >> n1; // cout << z1 << endl; if(n != n1) { cout << "No" << endl; return 0; } for(int i = 1; i <= n1; i++) { getchar(); char c, x, y; scanf("%c %c %c", &c, &x, &y); if(x == '-') x = '0' - 1; if(y == '-') y = '0' - 1; b[i].c = c; b[i].l = x - '0' + 1; b[i].r = y - '0' + 1; z1 = z1 - b[i].l - b[i].r; } y1 = z1; if(dfs(x1, y1)) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
最新回复(0)