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

写在最前面

按照课程讲解的思路来写,逻辑关系能够理解清楚了,但是实际运行起来实在是有问题,虽然在PTA上能够通过。但是我自己看不出问题来,并且,看了一遍又一遍仍然看不出来!(可能自己太笨。。)这就说明有着很严肃的问题!
所以,与其这样纠结,不如按照自己理解的思路来写一遍

补充一下题目要求

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

课程讲解的思路

#include <cstdio>
#include <cstdlib>//按题目的意思,存储树的是静态链表
//即建一个结构,里面三个变量char型结点字母,int型的左右孩子的位置#define MaxTree 10 //题目的意思:最多十个结点
#define ElementType char
#define Tree int
#define Null -1Tree BuildTree(struct TreeNode T[]);
int Isomorphic(Tree R1, Tree R2);//建一个二叉树的结构,并用数组的元素指向该结构
struct TreeNode
{ElementType Element;Tree Left;Tree Right;
}T1[MaxTree], T2[MaxTree];
//这样就可以直接按题目要求进行逐行读入了//程序的整体框架
int main()
{Tree R1, R2;R1 = BuildTree(T1);//printf("%d\n", R1);R2 = BuildTree(T2);//printf("%d\n", R2);if (Isomorphic(R1, R2)) // 返回1说明同构,返回0说明不同构printf("Yes\n");elseprintf("No\n");return 0;}//建二叉树
//1、将结点、左右孩子的位置读入数组结构
//2、通过遍历数组,找出头结点
//没有其他结点指向的就是头结点,所以可以用一个标志Tree BuildTree(struct TreeNode T[])
{int N;int Isnode[MaxTree] = {0};char cl, cr; //因为有'-'存在,所以先用char型变量暂存,然后再放到结构里scanf("%d\n", &N);if (N) {for (int i = 0; i < N; i++) {scanf("%c %c %c\n", &T[i].Element, &cl, &cr); //'-'在结构里用-1表示if (cl != '-') {T[i].Left = cl - '0'; //在这里可以同时加入对于根结点的判断Isnode[T[i].Left] = 1;}elseT[i].Left = Null;if (cr != '-') {T[i].Right = cr - '0';Isnode[T[i].Right] = 1;}elseT[i].Right = Null;}//最后遍历一遍结构数组,Isnode为0的就是头结点for (int m = 0; m < N; m++) {if (!Isnode[m])return m;}}return Null;
}//下面来判断是否为同构
//都为空树,直接返回1;一个空一个不空,直接返回0
//都不空:结点不同,直接0;结点相同,再看子树
//左子树同不存在,就递归调用右子树
//左子树存在,看是否相等,不相等就交换左右子树,再递归调用
int Isomorphic(Tree R1, Tree R2)
{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));elsereturn (Isomorphic(T1[R1].Left, T2[R2].Right) && Isomorphic(T1[R1].Right, T2[R2].Left));}

自己理解的思路

#include <cstdio>
#include <cstdlib>#define MaxTree 10
#define Null -1struct TreeNode
{char Element;int Left;int Right;
}T1[MaxTree], T2[MaxTree];int MadeTree (struct TreeNode T[]);
int Isomorphic(int R1, int R2);int main()
{int R1, R2;R1 = MadeTree(T1);R2 = MadeTree(T2);if (Isomorphic(R1, R2))printf("Yes\n");elseprintf("No\n");return 0;
}int MadeTree(struct TreeNode T[])
{int N;scanf("%d\n", &N);if (!N)return Null;else {char l,r;int Root[MaxTree] = {0};for (int i = 0; i < N; i++) {scanf("%c %c %c\n", &T[i].Element, &l, &r);if (l != '-') {T[i].Left = l - '0';Root[T[i].Left] = 1;}elseT[i].Left = Null;if (r != '-') {T[i].Right = r - '0';Root[T[i].Right] = 1;}elseT[i].Right = Null;}for (int m = 0; m < N; m++) {if (!Root[m])return m;}}return Null;
}int Isomorphic(int R1, int R2)
{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));elsereturn (Isomorphic(T1[R1].Left, T2[R2].Right) &&Isomorphic(T1[R1].Right, T2[R2].Left));
}

但是这样写,好像并没有什么本质的区别,和照抄没啥两样……
然后本地运行还是有问题:不是正常的回车结束。

暂时还没想明白是啥问题,应该是输入输出有关。

转载于:https://www.cnblogs.com/ZealYoung/p/10841234.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国人为什么学不会英语

英语永远也学不会! 这种抱怨和哀叹&#xff0c;大概在中国早已经司空见惯了。于是&#xff0c;有人开始计算学英语是多么大的浪费。 作为过来人&#xff0c;我对此深有体会。记得我当年也有过类似的绝望感。 但是&#xff0c;一位前辈安慰我说&#xff1a;你可以说你永远掌…

研究人员发现:基于文本的AI模型容易受到改述攻击

由于自然语言处理&#xff08;NLP&#xff09;的进步&#xff0c;越来越多的公司和组织开始利用AI算法来执行与文本相关的任务&#xff0c;例如&#xff1a;过滤垃圾邮件、分析社交媒体帖子和评论、评估简历以及检测假新闻。 但是&#xff0c;真的可以相信这些算法能够可靠地执…

解决 linux 下安装 node 报: command not found

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 注意&#xff1a;有时安装成功后,需要关闭xshell&#xff0c;重新启动。nvm才会生效。 1. 在 linux 下安装 node 提示 -bash: node: com…

阿里云官方网站免费套餐怎么抢

阿里云推出包含云服务器 ECS、负载均衡、云数据库 RDS、云数据库 Redis 版、云数据库 Mongodb 版、弹性公网 IP、CDN、对象存储 OSS、文件存储 NAS等40核心云产品&#xff0c;6个月免费使用何为免费套餐&#xff0c;其实就是让你先体验&#xff0c;觉得好用&#xff0c;易用&am…

1003 我要通过

1003 我要通过&#xff01; (20 分)“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件&#xff0c;系统就输出“答案正确”&#xff0c;否则输出“答案错误”。 得到“答案正确”的条件是&#xff1a; …

在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第一部分)

将游戏和其他使用大量 3D 图形的应用从 OpenGL 标准移植到 Google Android 设备&#xff08;包括构建在英特尔 凌动™ 微架构上的设备&#xff09;存在巨大的机遇&#xff0c;因为基于 OpenGL 的游戏、游戏引擎和其他传统软件易于获得&#xff1b;OpenGL 便于移植&#xff1b;而…

文件系统:使用 yum 安装软件包

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、yum命令的基本安装功能 [rootlocalhost ~]# man yum command is one of: * install package1 [package2] [...]&#xff1a; ins…

elasticsearch全局analyzer声明

2019独角兽企业重金招聘Python工程师标准>>> 问题 elasticsearch从2.4升级到5.6&#xff0c;elasticsearch.yml配置中有一些analyzer配置拷贝到新版本&#xff0c;启动报错 index :analysis :analyzer :lowercase_whitespace :type : customtokenizer : myTokenizer…

Parallels Desktop虚拟机无法关机提示“虚拟机处理器已被操作系统重置”

如果你在使用PD的时候遇到了这样子的弹窗&#xff0c;恭喜你篇博文可以帮助你&#xff0c;因为我刚刚也遇到了这个问题。如果有帮助可以点一下推荐按钮。 针对Windows电脑 启动虚拟机创建快照使用管理员权限运行命令提示符执行powercfg -h off重启试试成功了再删除快照即可修改…

linux下安装 ping 命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用docker仓库下载的ubuntu 14.04 镜像。里面精简的连 ping 命令都没有。google 百度都搜索不到ping 命令在哪个包里。 努力找了半天&…

扬尼斯定律:程序员的开发效率每6年提高一倍

我不断的听到各种关于“软件危机”的警言&#xff0c;以及关于软件开发缺少过程规范的批评。我做编程工作超过15年&#xff0c;我认为这些言论基本上都是错的&#xff1a;我确信我能在很短的时间里用如今的开发工具复制出15年前一个不错的程序员开发出的东西。 模仿摩尔定律和…

ApiBoot - ApiBoot Quartz 使用文档

ApiBoot Quartz ApiBoot内部集成了Quartz&#xff0c;提供了数据库方式、内存方式的进行任务的存储&#xff0c;其中数据库方式提供了分布式集群任务调度&#xff0c;任务自动平滑切换执行节点。 引用ApiBoot Quartz 在pom.xml配置文件内添加&#xff0c;如下配置&#xff1a; …

《算法竞赛进阶指南》0.4二分

102. 最佳牛围栏 农夫约翰的农场由N块田地组成&#xff0c;每块地里都有一定数量的牛,其数量不会少于1头&#xff0c;也不会超过2000头。 约翰希望用围栏将一部分连续的田地围起来&#xff0c;并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内至少需要包…

Hibernate 自动创建表

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 在 hibernate.cfg.xml 添加这句话&#xff0c;可以自动生成数据表 : <property name"hibernate.hbm2ddl.auto">upd…

程序员越老越优秀吗?

Peter Knego 向我们展示了一些有趣的东西&#xff1a; 官方数据&#xff1a;程序员年纪越大越出色、越稀有。他使用StackOverflow的声誉值和其它几个指标来印证他的观点。 他的总结是&#xff1a; 随着年龄的增加&#xff0c;程序员的数量急剧下降。程序员数量的峰值出现在2…

小程序学习(一):点击爱心变色 -- 最简单的事件实现

最近在学习小程序&#xff0c;想通过写文章来记录自己的学习历程&#xff0c;希望能做到每周都写…… 如何绑定一个事件 微信小程序中&#xff0c;绑定事件要在标签内写入这两段代码&#xff1a; bindtap"fnActive" data-favourite "{{isLike}}" 复制代码…

安全通信

安全通信 应用层协议大多数自己都没有实现加解密功能&#xff0c;比如http等。http就是直接把数据加载进来然后做简单编码&#xff08;也就是流式化&#xff09;然后响应客户端&#xff0c;然后数据在浏览器展示&#xff0c;这个数据在传输过程是明文的&#xff0c;你截获就可以…

出现 java.lang.NullPointerException 的几种原因、可能情况

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。一般报 java.lang.NullPointerException的 原因有以下几种&#xff1a;1. 字符串变量未初始化 。 2. 接口类型的对象没有用具体的类初始化…

纯JPA 入门小案例(2)

2019独角兽企业重金招聘Python工程师标准>>> JPA中的主键生成策略 通过annotation&#xff08;注解&#xff09;来映射hibernate实体的,基于annotation的hibernate主键标识为Id, 其生成规则由GeneratedValue设定的.这里的id和GeneratedValue都是JPA的标准用法。 JPA…

spring IoC/DI

一、spring创建对象的三种方式&#xff1a;1、通过构造方法创建无参构造创建&#xff1a;默认情况有参构造创建&#xff1a;需要明确配置<constructor-arg>中配置index&#xff1a;参数索引name&#xff1a;参数名type&#xff1a;参数类型&#xff08;区分基本数据类型和…