题目

给定两棵树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

show code

宏定义以及头函数声明

#define MaxTree 10//结构体数组元素的最大数目,树节点的最大数目
#define ElementType char
#define Tree int
#define Null -1
#include <stdio.h>

树的结构体表示,采用数组表示树的每个节点,每个数组元素表示一个节点,其又三个属性,Element表示其节点字符内容。

struct TreeNode
{ElementType Element;//Element为char类型Tree Left;//左子树的数组元素下标Tree right;//右子树的数组元素下标
}T1[MaxTree],T2[MaxTree];

整体函数框架

int main(){Tree R1,R2;R1=BuildTree(T1);//建立树R2=BuildTree(T2);if(Isomorphic(R1,R2)) printf("Yes\n");else printf("No\n");return 0;
}

建树函数

Tree BuildTree(struct TreeNode T[]){int N,Root;char cl,cr;//暂时存储读入左右子树的下标值scanf("%d\n",&N);//读入该树节点的个数int check[N],i;if(!N) return Null;//树为空,返回树的根节点所在结构体数组元素下标为-1if(N){for(i=0;i<N;i++) check[i]=0;//对每一个的节点的标志位进行初始化为0for(i=0;i<N;i++){scanf("%c %c %c\n",&T[i].Element,&cl,&cr);if(cl!='-'){T[i].Left=cl-'0';//字符型减去字符0,得到数字,赋给树的左子树check[T[i].Left]=1;}else T[i].Left=Null;//左孩子节点为空,给结构体数组的left赋值-1if(cr!='-'){T[i].right=cr-'0';check[T[i].right]=1;}else T[i].right=Null;//右孩子节点为空,给结构体数组的right赋值-1}for(i=0;i<N;i++){if(!(check[i])) break;//未被指向的是树根}Root=i;}return Root;//返回根节点所在数组元素的下标
}

check表示该数组元素是否有其他元素指向它,如果没有一个节点的Left和Right值指向该元素,则check为0(即该节点为树的根节点),否则为1.
建树函数返回的是T1,T2两棵树的根节点所在其数组元素的下标。

判断是否为同构函数

int Isomorphic(Tree R1,Tree R2){//R1为T1结构体数组的树根所在的数组下标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;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//交换的条件:①T1左子树空,T2左子树不空②T1左子树不空,T2左子树空③两个都不空,但是值不相同return  (Isomorphic(T1[R1].Left,T2[R2].right)&&Isomorphic(T1[R1].right,T2[R2].Left));
}   //交换左右子树,继续进行比较,递归调用本方法

这里判断同构有很多种情况。在需要交换的时候,共有三种情况。
一开始漏掉了当输入树节点个数为0时,对该种情况的处理(返回值根节点的数组元素下标为-1,即树为空),导致测试点空树时出现段错误,可见考虑分支情况时要全面!修改后终得满分!

数据结构——树的同构相关推荐

  1. 数据结构(三)树 —— 编程作业 01 :树的同构

    数据结构系列内容的学习目录 → \rightarrow →浙大版数据结构学习系列内容汇总.   题目描述: 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是&quo ...

  2. 数据结构(三)—— 树(4):树的同构

    数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总.   题意理解: 给定两棵树T1和T2.如果T1可以通过若干次左右子结点互换就变成T2,则我们称两棵树是" ...

  3. 数据结构:静态链表实现树的同构

    写在最前面 按照课程讲解的思路来写,逻辑关系能够理解清楚了,但是实际运行起来实在是有问题,虽然在PTA上能够通过.但是我自己看不出问题来,并且,看了一遍又一遍仍然看不出来!(可能自己太笨..)这就说明 ...

  4. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  5. pta 03-树1 树的同构 SDUT 3340 数据结构实验之二叉树一:树的同构

    03-树1 树的同构 (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵 ...

  6. 《数据结构》03-树1 树的同构

    题目 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子 ...

  7. [BJOI2015] 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1092  Solved: 460 [Submit][Stat ...

  8. 树根c语言,03-树1 树的同构 (C语言链表实现)

    #include #include #include #include typedef char ElemType; typedef struct BinTree { ElemType data; s ...

  9. 【BZOJ - 4337】BJOI2015 树的同构(树哈希)

    题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...

最新文章

  1. 二叉树:二叉搜索树实现 逆序数问题
  2. TextView实现跑马灯效果
  3. 结构体名和结构体名是个指针的区别
  4. 抽象类 VS 接口 (3)
  5. sqlmap常用操作命令
  6. 传统配置形式存在的问题
  7. 非官方影印版存在的问题
  8. Java连接Mysql数据库(JDBC)
  9. (转)petshop4.0中的Profile理解(匿名用户身份)
  10. python的zip()函数,压缩多个可迭代对象
  11. css悬停动画,animate.css:悬停脚本上的动画
  12. C编程语言中整型变量在内存中的存储形式介绍
  13. maven profile参数动态打入
  14. 微型计算机原理及应用课程复习与考研指导,微机原理及应用课程复习.doc
  15. tableau实战系列(十二)-使用盒须图查看你的数据分布
  16. 密西根州立大学计算机qs分数,密歇根州立大学2021年QS世界大学排名第157
  17. Javase 第五次作业智商题
  18. 数据库质疑修复总结 For SQL Server 2000/2005/2008/2008R2
  19. 10系统更新后计算机不见,你好!我的电脑一不小心升级到win10以后桌面上的资料都不见了?? 爱问知识人...
  20. Service com.android.exchange.ExchangeService has leaked ServiceConnection

热门文章

  1. 百度:抚顺县上马学校老师打学生!百度地震姜常宏就在那个学校求助?!!
  2. 数字孪生-未来工业的支柱
  3. CoinCola可盈可乐区块链行业周报第十一期(1.1-1.15)
  4. SpringCloud+Vue在线教育网站——整合Gateway网关
  5. PLUS模型教程3:用地扩张分析策略(LEAS)
  6. 路径规划算法:基于鸟群优化的路径规划算法- 附代码
  7. C 约瑟夫双向生死游戏
  8. ThinkPHP(tp5)一键生成静态方法
  9. php 修改文件属性命令,php:修改目录下文档权限(777,644 )
  10. jsp 将html字符串输出html标签(escapeXml)