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; 
} 

运行结果:

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

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

相关文章

CSPM.pdf

PDF转图片 归档&#xff1a;

跨境电商多店铺:怎么管理?风险如何规避?

跨境电商的市场辽阔&#xff0c;有非常多的商业机会。你可能已经在Amazon、eBay、Etsy等在线平台向潜在客户销售产品了。为了赚更多的钱&#xff0c;你可能还在经营多个店铺和品牌。 但是&#xff0c;像Amazon、eBay、Etsy等知名平台会有自己的规则&#xff0c;他们开发了很多…

手拉手springboot整合kafka发送消息

环境介绍技术栈springbootmybatis-plusmysqlrocketmq软件版本mysql8IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1.7kafka2.13-3.7.0 创建topic时&#xff0c;若不指定topic的分区(Partition主题分区数)数量使&#xff0c;则默认为1个分区(partition) springboot加入依赖kafk…

探索无限可能性——微软 Visio 2021 改变您的思维方式

在当今信息化时代&#xff0c;信息流动和数据处理已经成为各行各业的关键。微软 Visio 2021 作为领先的流程图和图表软件&#xff0c;帮助用户以直观、动态的方式呈现信息和数据&#xff0c;从而提高工作效率&#xff0c;优化业务流程。本文将介绍 Visio 2021 的特色功能及其在…

华为OD机试 - 游戏分组 - 递归(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

精准检测,安全无忧:安全阀检测实践指南

安全阀作为一种重要的安全装置&#xff0c;在各类工业系统和设备中发挥着举足轻重的作用。 它通过自动控制内部压力&#xff0c;有效防止因压力过高而引发的设备损坏和事故风险&#xff0c;因此&#xff0c;对安全阀进行定期检测&#xff0c;确保其性能完好、工作可靠&#xf…

使用pytorch构建ResNet50模型训练猫狗数据集

数据集 1.导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models import numpy as np import matplotlib.pyplot as plt import os from tqdm.auto import t…

流媒体服务器SMS-语音对讲(一)

1.简介 在国标语音对讲对接中&#xff0c;会发现不同的厂商或不同型号的设备&#xff0c;对讲流程都不一样&#xff0c;本文主要介绍流媒体与设备之间的交互情况。 SMS流媒体服务代码库地址&#xff1a;https://gitee.com/inyeme/simple-media-server 2.流媒体与设备交互的可能…

max6675热电偶温度采集

思路来源 参考价格 概述 MAX6675具有冷端补偿和将来自K型热电偶的信号数字化。数据以12位分辨率输出&#xff0c;SPI™兼容&#xff0c; 只读格式。该转换器将温度分解为0.25C&#xff0c;允许读数高达1024C&#xff0c;并显示热电偶8LSB在0C至 700C 引脚连接 温度采样电路 …

中间件复习之-消息队列

消息队列在分布式架构的作用 消息队列&#xff1a;在消息的传输过程中保存消息的容器&#xff0c;生产者和消费者不直接通讯&#xff0c;依靠队列保证消息的可靠性&#xff0c;避免了系统间的相互影响。 主要作用&#xff1a; 业务解耦异步调用流量削峰 业务解耦 将模块间的…

MySQL之创建高性能的索引(八)

创建高性能的索引 覆盖索引 通常大家都会根据查询的WHERE条件来创建合适的索引&#xff0c;不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询&#xff0c;而不单单是WHERE条件部分。索引确实是一种查找数据的高效方式&#xff0c;但是MySQL也可以使用索引来直…

向量数据库引领 AI 创新——Zilliz 亮相 2024 亚马逊云科技中国峰会

2024年5月29日&#xff0c;亚马逊云科技中国峰会在上海召开&#xff0c;此次峰会聚集了来自全球各地的科技领袖、行业专家和创新企业&#xff0c;探讨云计算、大数据、人工智能等前沿技术的发展趋势和应用场景。作为领先的向量数据库技术公司&#xff0c;Zilliz 在本次峰会上展…

【漏洞复现】电信网关配置管理系统 rewrite.php 文件上传漏洞

0x01 产品简介 中国电信集团有限公司(英文名称"China Telecom”、简称“"中国电信”)成立于2000年9月&#xff0c;是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员…

在线IP检测如何做?代理IP需要检查什么?

当我们的数字足迹无处不在&#xff0c;隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷&#xff0c;让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后&#xff0c;通在线检测网站检查IP&#xff0c;相当于一个”售前检验““售后质检”的作用。但是…

2024-5-31 石群电路-19

2024-5-31&#xff0c;星期五&#xff0c;10:53&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。今天就要回学校啦&#xff0c;当大家看到这篇推文的时候我已经要收拾收拾去赶返校的火车啦&#xff0c;和女朋友短暂分别&#xff0c;不过小别胜新婚吗&#xf…

笔记-docker基于ubuntu22.04安装Jitsi Meet

背景 利用JitsiMeet打造一个可以在线会议的环境&#xff0c;根据躺的坑&#xff0c;做个记录 参考 JitsMeet部署安装说明 开始操作 环境 docker run -it --name ubuntu22.04 ubuntu:22.04 /bin/bash问题 1、安装 openjdk-11 apt install openjdk-11-jdk配置环境变量&…

自媒体必用的50 个最佳 ChatGPT 社交媒体帖子提示prompt通用模板教程

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。无论是品牌宣传、个人展示&#xff0c;还是日常交流&#xff0c;我们都离不开它。然而&#xff0c;要在众多信息中脱颖而出&#xff0c;吸引大家的关注并不容易。这时候&#xff0c;ChatGPT这样的…

uniapp的tooltip功能放到表单laber

在uniapp中&#xff0c;tooltip功能通常是通过view组件的hover-class属性来实现的&#xff0c;而不是直接放在form的label上。hover-class属性可以定义当元素处于hover状态时的样式类&#xff0c;通过这个属性&#xff0c;可以实现一个类似tooltip的效果。 以下是一个简单的例…

跨境经营的艺术:中资企业海外市场售后服务创新与挑战

出海&#xff0c;已不再是企业的“备胎”&#xff0c;而是必须面对的“大考”&#xff01;在这个全球化的大潮中&#xff0c;有的企业乘风破浪&#xff0c;勇攀高峰&#xff0c;也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海&#xff0c;要么出局”的抉择&#xff…

一分钟学习数据安全——自主管理身份SSI基本概念

之前我们已经介绍过数字身份的几种模式。其中&#xff0c;分布式数字身份模式逐渐普及演进的结果就是自主管理身份&#xff08;SSI&#xff0c;Self-Sovereign Identity&#xff09;。当一个人能够完全拥有和控制其数字身份&#xff0c;而无需依赖中心化机构&#xff0c;这就是…