数据结构实验之二叉树一:树的同构
来源:互联网 发布:网站源码是什么和模板 编辑:程序博客网 时间:2024/05/16 23:07
数据结构实验之二叉树一:树的同构
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2
现给定两棵树,请你判断它们是否是同构的。
输入
输入数据包含多组,每组数据给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出”-”。给出的数据间用一个空格分隔。
注意:题目保证每个结点中存储的字母是不同的。
注意:题目保证每个结点中存储的字母是不同的。
输出
如果两棵树是同构的,输出“Yes”,否则输出“No”。
示例输入
8A 1 2B 3 4C 5 -D - -E 6 -G 7 -F - -H - -8G - 4B 7 6F - -A 5 1H - -C 0 -D - -E 2 -
示例输出
Yes
提示
测试数据对应图1
来源
xam
示例程序
这道题看上去似乎很难得样子,所以一开始根本不愿意敲,不过还是耐下心来敲了下,但是呢?敲着就乱了,就在网上搜了下,发现一篇思路比较清晰的,看了后,又重新敲了边,在一些重要的地方加上了注释。
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ char ch; int l,r;}Node;Node s[1000]; //建一个结构体数组,将输入的数据记录下来typedef struct node{ char data; struct node *lc,*rc;}tree;tree * creat(int i){ tree *r; r = (tree *)malloc(sizeof(tree)); r->lc = r->rc = NULL; r->data = s[i].ch; if(s[i].l != -1) //看左子树是否有值 r->lc = creat(s[i].l); if(s[i].r != -1) r->rc = creat(s[i].r); return r;}tree * build(int n){ int i; int f[20]; tree *root; char a[10],b[10],c[10]; memset(f,0,sizeof(f)); for(i = 0;i < n;i++) { scanf("%s %s %s",a,b,c); s[i].ch = a[0]; if(b[0] == '-') s[i].l = -1; else { s[i].l = b[0] - '0'; f[s[i].l] = 1; //在此标记是为了在后来找出根节点 } if(c[0] == '-') s[i].r = -1; else { s[i].r = c[0] - '0'; f[s[i].r] = 1; } } for(i = 0;i < n;i++) if(!f[i]) //根节点没有标记,因此确定根节点,然后进行递归创建树 break; root = creat(i); return root;}int judge(tree *r1,tree *r2){ if(r1 == NULL && r2 == NULL) return 1; if(r1 != NULL && r2 != NULL) { if(r1->data == r2->data) { if((judge(r1->lc,r2->lc) && judge(r1->rc,r2->rc)) || (judge(r1->rc,r2->lc) && judge(r1->lc,r2->rc))) //递归的比较是否调换完相同,没调换相同 return 1; } } return 0;}int main(){ int n,m; tree *r1,*r2; while(~scanf("%d",&n)) { r1 = build(n); scanf("%d",&m); r2 = build(m); if(judge(r1,r2)) printf("Yes\n"); else printf("No\n"); } return 0;}
1 0
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- SDUT数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- SDUT3340数据结构实验之二叉树一:树的同构
- SDUT数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- OJ3340数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- SDUT 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- 数据结构实验之二叉树一:树的同构
- Spring(4)--Spring的核心机制:依赖注入(面向接口)
- Java 集合转换(数组,list,set,map)
- 确定C语言各类型变量取值范围(通过头文件)
- 设计模式总结之Prototype Pattern(原型模式)
- Java包含哪些基本数据类型及包装类?
- 数据结构实验之二叉树一:树的同构
- HDU 2544 最短路
- NOI2015 D1 T2 软件包管理器
- Java修饰符
- redis 安装
- P1396 营救
- JavaFX的监听
- items和iteritems
- [UWP]在UWP中使用EntityFrameworkCore + SQLite