03 - 树 1 树的同构 (25 分)
2017-03-26 22:55
423 查看
给定两棵树 T1 和 T2。如果 T1 可以通过若干次左右孩子互换就变成 T2,则我们称两棵树是 “同构” 的。例如图 1 给出的两棵树就是同构的,因为我们把其中一棵树的结点 A、B、G 的左右孩子互换后,就得到另外一棵树。而图 2 就不是同构的。
现给定两棵树,请你判断它们是否是同构的。
输入格式:
输入给出 2 棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数 NN (\le 10≤10),即该树的结点数(此时假设结点从 0 到 N-1N−1 编号);随后 NN 行,第 ii 行对应编号第 ii 个结点,给出该结点中存储的 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代码实现如下
#include <stdio.h> /* 二叉树表示 建二叉树 同构判别 */ /* 结构数组表示二叉树,静态链表 */ #define MaxTree 10 #define ElementType char #define Tree int #define Null -1 struct TreeNode{ ElementType Element; Tree Left; Tree Right; }T1[MaxTree],T2[MaxTree]; int Isomorphic(Tree R1,Tree R2){ //both empty if ((R1==Null)&&(R2==Null)) { return 1; } //one of them is empty if (((R1==Null)&&(R2!=Null))||((R1!=Null)&&(R2==Null))) { return 0; } //roots are different if (T1[R1].Element!=T2[R2].Element) { return 0; } if ((T1[R1].Left==Null)&&(T2[R2].Left==Null)) { return Isomorphic(T1[R1].Right, T2[R2].Right); } if (((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&& ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element))) { return (Isomorphic(T1[R1].Left, T2[R2].Left)&& Isomorphic(T1[R1].Right, T2[R2].Right)); } else { return (Isomorphic(T1[R1].Left, T2[R2].Right)&&Isomorphic(T1[R1].Right, T2[R2].Left)); } } Tree BuildTree(struct TreeNode T[]){ int i=0,N=0; char cl,cr; int check[MaxTree]; Tree Root=0; scanf("%d\n",&N); if (N) { for (i=0;i<N;i++) { check[i]=0; } for (i=0;i<N;i++) { scanf("%c %c %c\n",&T[i].Element,&cl,&cr); if (cl!='-') { T[i].Left=cl-'0'; check[T[i].Left]=1; } else { T[i].Left=Null; } //对cr的对应处理 if (cr!='-') { T[i].Right=cr-'0'; check[T[i].Right]=1; } else { T[i].Right=Null; } } /*for (i=0;i<N;i++) { printf("%c %d %d\n",T[i].Element,T[i].Left,T[i].Right); }*/ for (i=0;i<N;i++) { if (!check[i]) { break; } } Root=i; //printf("%d",Root); }else { Root=-1; } return Root; } //建程序框架 int main(int argc, char *argv[]) { //建二叉树1 //建二叉树2 //判别是否同构并输出 Tree R1,R2; R1=BuildTree(T1); R2=BuildTree(T2); if(Isomorphic(R1,R2)){ printf("Yes\n"); } else{ printf("No\n"); } return 0; }
相关文章推荐
- 03-树1 树的同构(25 分)
- 中国大学MOOC-陈越、何钦铭-数据结构-2017秋 03-树1 树的同构(25 point(s))
- 03-树1 树的同构(25 分)
- 03-树1 树的同构(25 分) 2017秋 数据结构 陈越、何钦铭
- 03-树1 树的同构(25 分)
- 数据结构——03-树1 树的同构(25 分)
- 03-树1 树的同构(25 分)
- 03-树1 树的同构(25 point(s)) 【Tree】
- PTA 树的同构(25 分)
- 03-树3 Tree Traversals Again(25 分)
- 03-树1 树的同构 (25分)
- MOOC浙大数据结构 — 03-树1 树的同构 (25分)
- PAT : 03-树1. List Leaves (25)
- 中国大学MOOC-陈越、何钦铭-数据结构-2017秋03-树3 Tree Traversals Again(25 point(s))
- 本周ASP.NET英文技术文章推荐[02/25 - 03/03]
- 【收藏】本周ASP.NET英文技术文章推荐[03/25 - 03/31]
- 03-树1 树的同构
- 03-树1 树的同构 (25分)
- 03-2. List Leaves (25)--c语言实现
- 03-树2. Tree Traversals Again (25)