7-3 树的同构(25 分)
来源:互联网 发布:伏地魔魔杖数据 编辑:程序博客网 时间:2024/06/05 04:31
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。
//示例图略
现给定两棵树,请你判断它们是否是同构的。输入格式:>
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N
(≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。输出格式:>
如果两棵树是同构的,输出“Yes”,否则输出“No”。
输入样例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:
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>#include<stdlib.h>typedef struct Tree *BT;struct Tree{ int left; int right; char data;};BT writeTree(int);int isLikeTree(BT, int, BT, int);int main(void){ int N, M; BT T1, T2; scanf("%d", &N); getchar(); T1 = writeTree(N); scanf("%d", &M); getchar(); T2 = writeTree(M); if(isLikeTree(T1, N, T2, M) == 0) puts("Yes"); else puts("No"); free(T1); free(T2); return 0;}//建树并输入树的信息,输入按字符BT writeTree(int n){ int count; char cl, cr; BT BitTree; BitTree = (BT)calloc(n, sizeof(struct Tree)); for(count = 0; count < n; count++) { BitTree[count].data = getchar(); getchar(); cl = getchar(); getchar(); cr = getchar(); getchar(); if(cl >= '0' && cl <= '9') { BitTree[count].left = cl - '0'; } else { BitTree[count].left = -1; } if(cr >= '0' && cr <= '9') { BitTree[count].right = cr - '0'; } else { BitTree[count].right = -1; } } return BitTree;}/*传入树1根、树1节点数,树2根、树2节点数。是同一棵树时返回0*/int isLikeTree(BT Tree1, int N, BT Tree2, int M){ int cnt1, cnt2; int JUG = 0; if(N != M) return 1; if(N == 1 && M == 1 ) { if(Tree1[cnt1].data - Tree2[cnt2].data) return 1; } //搜索两树的每一个节点 for(cnt1 = 0; cnt1 < N; cnt1++) { for(cnt2 = 0; cnt2 < M; cnt2++) { if(Tree1[cnt1].data - Tree2[cnt2].data == 0) //比较节点值相同的节点 { if(Tree1[cnt1].left == -1 && Tree2[cnt2].left == -1 && Tree1[cnt1].right == -1 && Tree2[cnt2].right == -1) //遇到同为叶节点 { break; } else if( (Tree1[cnt1].left == -1 && Tree1[cnt1].right == -1) && (Tree2[cnt2].right != Tree2[cnt2].left) ) //树1叶节点,对应到树2有子节点 { JUG++; break; } else if( (Tree1[cnt1].left != Tree1[cnt1].right) && (Tree2[cnt2].right == -1 && Tree2[cnt2].left == -1) ) //树1节点有子节点,对应树2叶节点 { JUG++; break; } else if( (Tree1[cnt1].left == -1 || Tree1[cnt1].right == -1) && (Tree2[cnt2].right != -1 && Tree2[cnt2].left != -1) ) //树1单边子,树2叶节点 { JUG++; break; } else if( (Tree2[cnt2].left == -1 || Tree2[cnt2].right == -1) && (Tree1[cnt1].right != -1 && Tree1[cnt1].left != -1) ) //树2单边子,树1叶节点 { JUG++; break; } else { if( ( (Tree1[Tree1[cnt1].left].data != Tree2[Tree2[cnt2].left].data) && (Tree1[Tree1[cnt1].right].data != Tree2[Tree2[cnt2].right].data) ) && ( (Tree1[Tree1[cnt1].right].data != Tree2[Tree2[cnt2].left].data) && (Tree1[Tree1[cnt1].left].data != Tree2[Tree2[cnt2].right].data) ) ) //两树节点的子节点都对不上 { JUG++; } break; } }//if(Tree1[cnt1].data - Tree2[cnt2].data == 0) }//for(cnt2 = 0; cnt2 < M; cnt2++) }//for(cnt1 = 0; cnt1 < N; cnt1++) return JUG;}
- 7-3 树的同构(25 分)
- 7-3 树的同构(25 分)
- 5-3 树的同构 (25分)
- 5-3 树的同构 (25分)
- 5-3 树的同构 (25分)
- 树的同构(25 分)
- PTA 7-1 树的同构(25 分)
- 7-10 树的同构(25 分)
- PTA 7-1 树的同构(25 分)25分代码 结构体保存结点
- 树的同构(25 分)[有点难度的递归]
- 5-3 树的同构 (25分) PTA
- 03-树1 树的同构(25 分)
- PTA 03-树1 树的同构(25 分)
- PTA 数据结构与算法题目集(中文)5-3 树的同构 (25分)
- 03-树1 树的同构 (25分)
- 03-树1 树的同构 (25分)
- 03-树1 树的同构 (25分)
- 03-树1 树的同构 (25分)
- 可变参数列表
- 软件工程之用户界面设计和软件维护
- kNN算法--Python3实现
- hive-2.3.2配置步骤及问题解答
- android中的EditText的使用
- 7-3 树的同构(25 分)
- 关于ubuntu老版本update时出现error 404 not found问题
- 博主的github链接
- django获取当前url
- Booking网站爬虫,获取酒店评论内容(Python)
- Java中的序列化与反序列化
- 会议记录管理系统(3)
- Android xmlns分类及使用
- Array和Arrays的区别