程序:

 1 #include <stdio.h>
2 #define MaxTree 10
3 #define ElementType char
4 #define Tree int
5 #define Null -1
6
7 struct TreeNode {
8 ElementType Element;
9 Tree Left;
10 Tree Right;
11 } T1[MaxTree],T2[MaxTree];
12 int N,check[MaxTree];
13
14 Tree BuildTree(struct TreeNode T[]) {
15 int Root=Null,i; //将根结点置为空,若为空树时返回Null
16 char cl,cr;
17 scanf("%d\n",&N);
18 if(N) {
19 for(i=0; i<N; i++) check[i]=0; //将check[]置0
20 for(i=0; i<N; i++) {
21 scanf("%c %c %c\n",&T[i].Element,&cl,&cr);
22 if(cl!='-') {
23 T[i].Left=cl-'0';
24 check[T[i].Left]=1;
25 } else T[i].Left=Null;
26 if(cr!='-') {
27 T[i].Right=cr-'0';
28 check[T[i].Right]=1;
29 } else T[i].Right=Null;
30 }
31 for(i=0; i<N; i++)
32 if(!check[i]) break;
33 Root=i;
34 }
35 return Root;
36 }
37
38 int Isomorphic(Tree R1,Tree R2) {
39 //都为空树则同构
40 if((R1==Null)&&(R2==Null))
41 return 1;
42 //只有一个根结点为空则不同构
43 if(((R1==Null)&&(R2!=Null))||((R1!=Null)&&(R2==Null)))
44 return 0;
45 //根结点数据不同则不同构
46 if(T1[R1].Element!=T2[R2].Element)
47 return 0;
48 //左儿子都为空,判断右儿子是否同构
49 if((T1[R1].Left==Null)&&(T2[R2].Left==Null))
50 return Isomorphic(T1[R1].Right,T2[R2].Right);
51 //左儿子结点都不为空且数据相等,对左儿子的左右子树进行递归
52 if(((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&&
53 ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)))
54 return(Isomorphic(T1[R1].Left,T2[R2].Left)&&
55 Isomorphic(T1[R1].Right,T2[R2].Right));
56 //左儿子不一样,左右交换后递归
57 else
58 return(Isomorphic(T1[R1].Left,T2[R2].Right)&&
59 Isomorphic(T1[R1].Right,T2[R2].Left));
60 }
61
62 int main() {
63 Tree R1,R2;
64 R1=BuildTree(T1);
65 R2=BuildTree(T2);
66 if(Isomorphic(R1,R2))
67 printf("Yes\n");
68 else printf("No\n");
69 return 0;
70 }

分析:

1、用数组存储树,结点无序

2、需找出树的根结点

3、判断是否同构要考虑周全

[刷题] PTA 03-树1 树的同构的更多相关文章

  1. 【刷题】BZOJ 4817 [Sdoi2017]树点涂色

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  2. 【刷题】BZOJ 1211 [HNOI2004]树的计数

    Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要 ...

  3. 【刷题】BZOJ 1036 [ZJOI2008]树的统计Count

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...

  4. 刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)

    这是一道关于线段树的区间开根号的裸题,没什么好讲的. 值得注意的是,因为有区间开根号的性质,所以我们每一次更改操作只能把更改区间所覆盖的所有元素全部查找,当然你直接找效率明显爆炸... 能够注意到,指 ...

  5. 【刷题】COGS 2701 动态树

    ★★★☆ 输入文件:dynamic_tree.in 输出文件:dynamic_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 开始时有n个点形成的森林,共m个操作. ...

  6. 刷题总结——谈笑风生(主席树+dfs序的应用)

    题目: Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同 ...

  7. C#LeetCode刷题之#100-相同的树(Same Tree)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4066 访问. 给定两个二叉树,编写一个函数来检验它们是否相同. ...

  8. c++刷题(21/100)树的打印、矩阵覆盖和括号生成

    题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问 ...

  9. c++刷题(18/100)树

    题目1:二叉搜索树的第k个节点 给定一颗二叉搜索树,请找出其中的第k小的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路:因为是二叉搜索树 ...

随机推荐

  1. 第2课:操作系统网络配置【DevOps基础培训】

    第2课:操作系统网络配置 --DevOps基础培训 1. DNS配置 1.1 什么是DNS? 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和IP ...

  2. docker部署skywalking

    https://www.cnblogs.com/xiao987334176/p/13530575.html

  3. 【pytest系列】- assert断言的使用

    unittest断言方式是用过框架自己实现的,即self.assertEqual()等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类, ...

  4. ubuntu16.04 下同时打开多个终端窗口

    reference :https://forums.solydxk.com/viewtopic.php?t=5139 reference : http://blog.51cto.com/huqilon ...

  5. Druid 监控分布式解决方案

    什么是 Druid Monitor Druid 是一个非常强大的数据库连接池,但是它的强大并不仅仅体现在作为一个高性能连接池加快数据访问上和连接管理上,它内置了一个强大的监控工具:Druid Moni ...

  6. Chrome/Chromium的实验性功能+扩展推荐,让你的Chrome/Chromium起飞!

    1 实验性功能 Chrome/Chromium内置了一些很酷的实验性功能,打开 chrome://flags 即可访问.打开这些实验性功能后,浏览器的使用体验会更好,这里Chrome的版本为80.0. ...

  7. (十七)VMware Harbor 垃圾清理

    1. 在线垃圾清理 注意:从Harbor中删除镜像时不释放空间,垃圾收集是通过从清单中不再引用文件系统中删除blob来释放空间的任务. 注意:在执行垃圾收集时,Harbor将进入只读模式,并且禁止对d ...

  8. 我与Git的那些破事(上)--代码管理

    1. Git是什么? 作为一名程序猿,我相信大家都或多或少接触过git--分布式版本控制软件. 有人说,它是目前世界上最先进的分布式版本控制系统,我想说,是否最先进不知道,但确实好用,实用. 作为一款 ...

  9. Day01_11_Java方法

    Java - 方法 什么是java中的方法? - 方法就是一段代码片段,并且这段代码可以完成某个特定的功能.动作.是可以被重复的使用. - 方法就是类的一个动作. - 方法在C语言中也叫做函数 或 f ...

  10. prometheus+grafana监控mysql最佳实践

    导航 前言 环境准备 安装Docker 安装prometheus 安装mysqld_exporter prometheus采集数据 安装grafana grafana配置数据源 感谢您的阅读,预计阅读 ...