03-树1 树的同构(浙大数据结构PTA习题)

03-树1 树的同构        分数 25        作者 陈越        单位 浙江大学

给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

fig1.jpg

图1

图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

代码长度限制:16 KB        时间限制:400 ms        内存限制:64 MB

题目解析:

第一个关键点:如何找出树的根结点

第二个关键点:知道树的根结点后如何构建树

        采用递归的思路,如果根结点的左子树不为空,则递归构建,否则为NULL;如果根结点的右子树不为空,则递归构建,否则为NULL;

第三个关键点:如何判断两棵树是否同构

        采用递归的思路:(1)两棵树的根结点都为NULL,则两棵树同构;(2)两个根结点相同的前提下,(树1的左子树与树2的左子树同构 并且 树1的右子树与树2的右子树同构) 或者 (树1的左子树与树2的右子树同构 并且 树1的右子树与树2的左子树同构),则两棵树同构;

代码展示:

# include<stdio.h>
# include<stdbool.h>
# include<stdlib.h>

typedef char ElementType;

typedef struct TreeNode* Tree;
struct TreeNode{
	ElementType info,left,right;
	Tree Left;
	Tree Right;
};

bool IsSame(Tree Tree1, Tree Tree2);
Tree Create();
Tree InitialTree(Tree Array[],int N);
Tree CreateTree(Tree Array[],Tree Root);


int main(){
	// 构建两棵树 
	Tree tree1 = Create();
	Tree tree2 = Create();
	// 判读这两棵树是否同构 
	if(IsSame(tree1,tree2))printf("Yes");
	else printf("No");
	return 0; 
}

// 根据输入创建一棵树
Tree Create(){
	int N;
	scanf("%d",&N);
	getchar();
	// 易错:如果一来就是空树,那么直接返回空树,否则后面会发生段错误
	if(N==0)return NULL; 
	Tree Array[N];
	// 将信息存入指针数组中并获得树的根结点
	Tree Root = InitialTree(Array,N);
	// 通过树的根结点来建立树 
	Tree tree = CreateTree(Array,Root);
	return tree; 
} 

// 将结点信息存入指针数组中,并返回树的根结点 
Tree InitialTree(Tree Array[],int N){
	// Check数组用来标记结点是否作为了子节点 
	int i,Check[N];
	for(i=0;i<N;i++)Check[i] = 1;
	// 读入结点信息,并判读每个结点是否作为了子节点 
	for(i=0;i<N;i++){
		Tree node = (Tree)malloc(sizeof(struct TreeNode));
		node->info = getchar();
		getchar();
		node->left = getchar();
		if(node->left!='-')Check[node->left-'0'] = 0;
		getchar();
		node->right = getchar();
		if(node->right!='-')Check[node->right-'0'] = 0;
		getchar();
		node->Left = node->Right = NULL;
		Array[i] = node;
	}
	for(i=0;i<N;i++){
		if(Check[i]==1)break;
	}
	return Array[i];
}

// 根据指针数组递归构建一棵树
Tree CreateTree(Tree Array[],Tree Root){
	int i,count;
	// 递归构建左子树 
	if(Root->left == '-'){
		Root->Left = NULL;
	}else{
		Root->Left = CreateTree(Array,Array[Root->left-'0']);
	}
	// 递归构建右子树
	if(Root->right == '-'){
		Root->Right = NULL;
	}else{
		Root->Right = CreateTree(Array,Array[Root->right-'0']);
	}
	return Root;
} 

// 递归判读两棵树是否同构
bool IsSame(Tree Tree1, Tree Tree2){
	// 根结点都为空,则视为同构
	if(Tree1==NULL && Tree2==NULL)return true;
	// 根结点一个为空,一个不为空,则不同构
	if(Tree1==NULL && Tree2 || Tree1 && Tree2==NULL)return false;
	// 根结点都为不为空,但不相同,则不同构
	if(Tree1->info != Tree2->info)return false;
	// Tree1的左子树与Tree2的左子树同构 并且 Tree1的右子树与Tree2的右子树同构 
	if(IsSame(Tree1->Left,Tree2->Left)&&IsSame(Tree1->Right,Tree2->Right))return true;
	// Tree1的左子树与Tree2的右子树同构 并且 Tree1的右子树与Tree2的左子树同构 
	if(IsSame(Tree1->Left,Tree2->Right)&&IsSame(Tree1->Right,Tree2->Left))return true; 
} 

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库

背景 在当今信息爆炸的时代&#xff0c;新闻内容的分类和预测对于用户个性化推荐和信息检索至关重要。基于朴素贝叶斯算法的新闻类型预测系统结合了机器学习和自然语言处理技术&#xff0c;能够根据新闻内容自动进行分类&#xff0c;提高新闻处理效率和准确性。采用Django框架…

Spring MVC 应⽤分层

什么是应用分层 引用分层是一种软件开发思想 将应用程序分为N个层次每个层次负责各个职责 其中MVC是常见的设计模式这就是应用分层的具体体现 目前主流的开发方式是前后段分离后端开发工程师不再需要关注前端的实现,对此就需要分为表现层&#xff0c;数据层&#xff0c;业务逻…

RxSwift - 实现一个MVVM架构的TableView

文章目录 RxSwift - 实现一个MVVM架构的TableView前沿MVVM架构的Tableview目录结构1、模型&#xff08;Model&#xff09;2、视图模型&#xff08;ViewModel&#xff09;3、视图&#xff08;View&#xff09; 界面效果 RxSwift - 实现一个MVVM架构的TableView 前沿 MVVM架构在…

IBM开源Granite Code模型,多尺寸可选,支持多种代码任务,性能媲美 CodeLlama

前言 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在代码领域展现出惊人的潜力&#xff0c;为软件开发流程带来了革命性的改变。代码 LLM 不仅能够生成高质量代码&#xff0c;还能帮助程序员修复错误、解释代码、编写文档等等&#xff0c;极大地提高了软件开发…

MyBatis通用Mapper:简化数据库操作的利器

引言 在软件开发中&#xff0c;数据库操作是不可或缺的一部分。通常我们会使用mybatis&#xff0c;的MBG插件&#xff0c;自动生成表对应的基本操作语句xml。 当我们的表字段发生变化的时候&#xff0c;我们需要修改实体类和Mapper文件定义的字段和方法。如果是增量维护&…

为何ICLR未能进入CCF推荐期刊会议列表?

会议之眼 快讯 最近小编在思考一个问题&#xff1a;ICLR&#xff08;International Conference on Learning Representations&#xff09;即国际学习表征会议自2013年诞生以来&#xff0c;ICLR以其开放的学术氛围、创新的研究议题和前沿的科学探索&#xff0c;迅速成为AI领域不…

【工具】 MyBatis Plus的SQL拦截器自动翻译替换“?“符号为真实数值

【工具】 MyBatis Plus的SQL拦截器自动翻译替换"?"符号为真实数值 使用MyBatis的配置如下所示&#xff1a; mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl调用接口&#xff0c;sql日志打印如下&#xff1a; 参数和sql语句不…

苏州金龙新V系客车科技助力“粤”动广州

粤动活力新V系&#xff01; 5月23日&#xff0c;苏州金龙新V系智慧客车推介会在羊城广州举行。活动现场展出了4款新V系代表车型&#xff0c;来自广东省旅游客运、道路运输行业的200余位从业者齐聚一堂&#xff0c;共同品鉴、体验了苏州金龙新V系产品的“新、心、芯”魅力。苏州…

Perplexity 搜索引擎刚刚推出了新的页面功能——维基百科可以扔了

Perplexity 允许用户根据搜索结果创建自定义页面 人工智能搜索引擎初创公司 Perplexity 推出了一项新功能&#xff0c;使其结果更具粘性&#xff0c;允许用户将研究转变为易于共享的页面。页面建立在 Perplexity 中现有的人工智能驱动的搜索功能之上&#xff0c;该功能使用与 …

Artifactory清理二进制文件丢失的制品

一、摘要 当制品上传到 Artifactory 时&#xff0c;Artifactory 会在数据库中记录制品的相关元数据信息&#xff0c;包括文件路径、大小、校验和&#xff08;如 MD5、SHA1&#xff09;、上传时间、索引、依赖等。实际的制品二进制文件会存储在指定的存储后端&#xff0c;具体的…

【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

2年go蓝炎科技、爱诗科技面试经历,期望薪资22K

广州蓝炎科技一面 1、简单自我介绍&#xff1f;用的什么技术栈&#xff1f; 2、go的map是线程安全的吗&#xff1f; 3、Channel一般会在什么场景下使用&#xff1f;往一个未初始化的channel发送数据&#xff0c;会怎样&#xff1f; 4、关于go里头的随机数是线程安全的吗&am…

不同厂商SOC芯片在视频记录仪领域的应用

不同SoC公司芯片在不同产品上的应用信息&#xff1a; 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺&#xff0c;4个ARM Cortex-A7处理器&#xff0c;1.5GHz主频&#xff0c;2核MaliT628 GPU&#xff0c;1300万像…

基于51单片机多功能防盗报警proteus仿真( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机多功能防盗报警系统 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 基于51单片机多功能防盗报警系统( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus8.9及以上…

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录 1. 前言2. memmove()函数2.1 memmove()函数与memcpy()函数的差异2.2 memmove()函数的原型2.3 memmove()函数的使用案例 3. memmove()函数的模拟实现4. 总结 1. 前言 在之前&#xff0c;我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话&#…

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919)

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919) 1.漏洞描述 Check Point Security Gateways 是 Check Point Sofware 提供的一系列 网络安全Q解决方案。这些解决方案包括下一代防火墙(NGFW)、数据中心安全网关和 A1驱动的量子网关&#xff0c;旨在为企业提供针对…

反思 GTC 和 OFC 2024:没有一刀切的方法,但上市时间是关键!

在GTC 2024期间&#xff0c;英伟达宣布了最新的Blackwell B200张量核心GPU&#xff0c;旨在为万亿参数的AI大型语言模型提供支持。Blackwell B200需要先进的800Gbps网络&#xff0c;完全符合在AI工作负载的AI网络报告中概述的预测。随着人工智能工作负载的流量预计每两年增长10…

销量逆袭!敦煌店铺如何靠自养号测评轻松引爆市场?

对于众多卖家而言&#xff0c;踏入中国领先的B2B跨境电商平台&#xff0c;如同步入了充满无尽机会的金矿。然而&#xff0c;有些卖家在平台上努力经营&#xff0c;但订单却寥寥无几。那么&#xff0c;究竟是什么原因导致了这种情况&#xff1f;接下来&#xff0c;我们将结合实际…

小程序webView 实现小程序内嵌H5页面

web-view | 微信开放文档 本案例新建了一个 webView页面 只渲染webView组件 配置路由,跳转页面的时候 前缀使用‘/subPages/webView/index?weburlhttps://xxxxx’ componentDidMount 的时候 获取路由中的 weburl 地址参数 async componentDidMount() {const router getCurre…

Coolmuster Android Assistant: 手机数据管理的全能助手

在数字化时代&#xff0c;智能手机不仅是通讯工具&#xff0c;更是个人数据的中心。随着数据量的不断增加&#xff0c;如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生&#xff0c;它是一款专为安卓用户设计的综合数据管理软件&#xff0…