[刷题] PTA 03-树1 树的同构
程序:
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 树的同构的更多相关文章
- 【刷题】BZOJ 4817 [Sdoi2017]树点涂色
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 【刷题】BZOJ 1211 [HNOI2004]树的计数
Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要 ...
- 【刷题】BZOJ 1036 [ZJOI2008]树的统计Count
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...
- 刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)
这是一道关于线段树的区间开根号的裸题,没什么好讲的. 值得注意的是,因为有区间开根号的性质,所以我们每一次更改操作只能把更改区间所覆盖的所有元素全部查找,当然你直接找效率明显爆炸... 能够注意到,指 ...
- 【刷题】COGS 2701 动态树
★★★☆ 输入文件:dynamic_tree.in 输出文件:dynamic_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 开始时有n个点形成的森林,共m个操作. ...
- 刷题总结——谈笑风生(主席树+dfs序的应用)
题目: Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同 ...
- C#LeetCode刷题之#100-相同的树(Same Tree)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4066 访问. 给定两个二叉树,编写一个函数来检验它们是否相同. ...
- c++刷题(21/100)树的打印、矩阵覆盖和括号生成
题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问 ...
- c++刷题(18/100)树
题目1:二叉搜索树的第k个节点 给定一颗二叉搜索树,请找出其中的第k小的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路:因为是二叉搜索树 ...
随机推荐
- Android Studio 之 制作 Nine-Patch 图片(.9图片)
•引言 9.png 可以保证图片在合适的位置进行局部拉伸,避免了图片全局缩放造成的图片变形问题. 但是由于Android Studio对于.9图片的检查更加严格,所以不符合AS要求的.9图片会带来很多 ...
- 使用 Github Actions artifact 在 workflow job 之间共享数据
(AgileConfig)[https://github.com/kklldog/AgileConfig] 在使用 react 编写UI后,变成了一个彻彻底底的前后端分离的项目,上一次解决了把reac ...
- Java String系列
String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...
- 使用VS Code从零开始开发调试.NET 5
使用VS Code 从零开始开发调试.NET 5.无需安装VS 2019即可开发调试.NET 5应用. VS Code 全称是 Visual Studio Code,Visual Studio Cod ...
- 【macOS】屏蔽Big Sur更新提示 消除更新红点
下面介绍如何屏蔽macOS系统更新,屏蔽Big Sur更新提示,消除更新红点. 取消自动更新选项 请选取苹果菜单 > "系统偏好设置",然后点按"软件更新&qu ...
- vim与系统剪贴版的交互
1 概述 vim中的复制,删除,替换(d,r,s,x,y等)的内容都会被保存到默认的未命名的寄存器中,之后可以通过p进行粘贴,但是,这个寄存器不是系统的剪贴版,很多时候需要vim与系统剪贴版的交互,那 ...
- Go-24-异常处理机制
error 接口 type error interface(){ Error() string } 在Go语言中处理错误的方式通常是将返回的错误与nil进行比较.nil值表示没有发生错误,而非nil值 ...
- 753. Cracking the Safe
There is a box protected by a password. The password is n digits, where each letter can be one of th ...
- hdu4499 搜索
题意: 给你一个棋盘,最大是5*5的,问你最多可以放多少个炮,炮和炮之间不可以相互攻击,这块只的是只能走一步,不存在两个炮中间三个棋子的情况.. 思路: 刚开始想的是把所有的空位置都 ...
- POJ2406 KMP前缀周期
题意: 给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3. 思路: 这个是比较常规的next应用,首先假 ...