(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

news2024/9/29 1:21:01

题意理解和二叉树表示

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2,则称两棵树是“同构”的。

eg1:现请你判断如下两棵树(左侧为T1,右侧为T2)是否为同构树?

显然T1可以通过有限次左右孩子互换变成T2,因此这两棵树是同构的

eg2:同上

这两棵树BC子树的子结点完全不同,T1不能互换变成T2,所以不是同构

程序题目:输入两颗二叉树的信息,判断两棵树是否为同构。

输入格式:

输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

输出格式:

如果两棵树是同构的,输出“Yes”,否则输出“No”。

解题思路

本题需要解决三个问题:

二叉树如何表示

一般使用链表或者数组。之前的文章提到可以使用含有一个数据域和两个指针域(一个left一个right)的结构链表来表示二叉树。或者是将二叉树视为满二叉树,无结点的地方留空,用数组表示。

讲解中使用了结构数组,又称静态链表。简单来说是将基本信息存放在数组当中,左右子树用类似链表的方式来表示。例如下面的图中二叉树使用二维数组分别存储结点位置、左右子树位置

 对应结构的代码:

#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1    //传统空指针是0,而0会和下标冲突
struct TreeNode{
    ElementType Element;    
    Tree Left;
    Tree Right;
} T1[MaxTree], T2[MaxTree];

如何构造二叉树

如何从输入的若干数据中建立对应的二叉树?

程序框架搭建

int main()
{
    Tree R1, R2;
 
    R1 = BuildTree(T1);
    R2 = BuildTree(T2);
    if (Isomorphic(R1, R2)) printf("Yes\n");
    else printf("No\n");
     
    return 0;
}

Tree BuildTree( struct TreeNode T[] ){
    scanf("%d\n", &N);
    if (N) {
        //设定check来判别指向,首先都设为0
        for (i=0; i<N; i++){
            check[i] = 0;
        }
        
        for (i=0; i<N; i++) {
            //循环读入每个结点该有的三个信息
            scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
            
            //若有结点A指向B,就将B的check设为1
            if (cl != '-') {
                //题目中设定为-的是没有左子树的
                T[i].Left = cl-'0';
                check[T[i].Left] = 1;
            }
            else T[i].Left = Null;

            …….. /*对cr的对应处理 */
        }
    
    //遍历结点找根结点,根结点是唯一一个没有被指向的结点,check值=0
    for (i=0; i<N; i++)
        if (!check[i]) break;
        Root = i;
    }
    return Root;
}

同构的判定

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 ) );
 
    /*可能是A左和B右同构,交换左右子树后判别*/
    else
        return ( Isomorphic( T1[R1].Left, T2[R2].Right) &&
        Isomorphic( T1[R1].Right, T2[R2].Left ) );

}

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

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

相关文章

REST风格 -- SpringMVC入门保姆级教程(四)

文章目录 前言四、REST风格1.了解REST风格2.REST风格写法一般步骤3.REST风格快速开发4.REST风格中的注解5. 案例&#xff1a;基于REST风格页面数据交互 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#…

Redis高级篇 - 分布式缓存

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c…

iPad触屏笔哪个牌子好用?Apple Pencil的平替笔

从无纸化的广泛使用&#xff0c;电容笔成为无纸化中不可替代的一部分。但由于原装电容笔的昂贵&#xff0c;市面上的电容笔品牌众多&#xff0c;不知如何下手&#xff0c;今天给大家推荐几款好用又平价的Apple Pencil平替笔。顺便给不知道如何挑选电容笔的小伙伴科普一下电容笔…

车载网络测试 - CANCANFD - 基础篇_02

目录 七、与CAN总线相关的标准 1、ISO 11898,ISO16845 2、SAE J1939,ISO 11783,NMEA 2000,CANopen 3、ISO15765/ISO14229 4、ISO 17356/OSEK 5、CCP(CAN Calibration Protocol) 6、GMLAN,VWTP,FNOS,DCNet,MCNet 八、CAN总线的特点 九、CAN总线基本概念 七、与CAN总线相…

机器学习-4 决策树算法

决策树算法 算法概述分类算法与分类器决策树算法树模型决策树的原理决策树算法的关键决策树构造的基本思路 算法基本思想决策树的训练与测试三种经典的决策树生成算法基于信息增益的ID3算法基于信息增益率的C4.5算法C4.5算法C5.0算法 基于基尼系数的CART算法 算法流程算法关键问…

chatgpt赋能python:Python中的包

Python中的包 对于使用Python进行编程的开发者来说&#xff0c;包是一个非常重要的概念。包可以看作是一个包含了多个模块的文件夹&#xff0c;这些模块可以在代码中使用。通过使用Python中的包&#xff0c;开发者可以使代码更加模块化&#xff0c;提高代码的可维护性和可读性…

Emacs之git操作(一百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Apache Impala(1):Impala简介

1 Impala 基本介绍 impala 是 cloudera 提供的一款高效率的 sql 查询工具&#xff0c;提供实时的查询效果&#xff0c;官方测试性能比 hive 快 10 到 100 倍&#xff0c;其 sql 查询比 sparkSQL 还要更加快速&#xff0c;号称是当前大数据领域最快的查询 sql 工具&#xff0c…

小主机折腾记13

这个月折腾的事比较多&#xff0c;记个流水账 1.600g2mt加装wifi模块&#xff1b; 买了ngff转pcie的转接卡&#xff0c;发现竟然不能原生支持蓝牙&#xff0c;需要额外接一个4pin转9针usb的线&#xff0c;600g2mt是没有那种通用的usb9针口的…… 而内建蓝牙的转接卡网上也有卖&…

【项目】ROS下使用N100模块

本文主要记录如何使用WHEELTEC N100 模块。 之前的版本是CP2102串口芯片&#xff0c;而2022年5月之后的N100采用的是CH9102串口芯片。 一、修改串口号&#xff1a; 工具&#xff1a;链接&#xff1a;https://pan.baidu.com/s/13Pdq45_Z0ZRwuaNN0I84Cg 提取码&#xff1a;i6j…

《深入理解计算机系统(CSAPP)》第6章 存储器层次结构 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

【计算机网络详解】——应用层(学习笔记)

&#x1f4d6; 前言&#xff1a;应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。在本文中&#xff0c;我们以一些经典的网络应用为例来学习有关网络应用的原理、协议和实现方面的知识。 目录 &a…

华为OD机试真题B卷 Java 实现【快速寻找某字符】,附详细解题思路

一、题目描述 给定一个一个目标值 target和一个 元素升序的无重复数字字符串 &#xff0c;写一个函数搜索 字符串 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 二、输入描述 第一行输入一个目标值target…

在Centos Stream 9上Docker的实操教程(三) - Docker容器数据卷

在Centos Stream 9上Docker的实操教程 - Docker容器数据卷 问题场景Docker容器数据卷简单介绍数据卷使用操作实例安装redis验证配置文件生效验证数据是否丢失 结语 问题场景 Docker容器我们可以理解就是微型的linux系统&#xff0c;在使用容器的时候自然会产生一系列数据文件&…

基于SpringBoot+Vue的儿童书法机构管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 儿童书法机构的管理是…

代码随想录算法训练营第四十二天 | 二维dp数组01背包, 力扣 416. 分割等和子集

背包 解析 1.确定dp数组以及下标的含义 对于背包问题&#xff0c;有一种写法&#xff0c; 是使用二维数组&#xff0c;即dp[i][j] 表示从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少。 2.确定递推公式 有两个方向推出来dp[i][…

跨境电商app开发搭建多语言商城后的运营技巧,一件了解电子商城及运营

跨境电商APP包含&#xff1a;买家端手机H5版本, 电脑Pc网页版本, 安卓苹果App。 一、模式介绍 如需要探讨&#xff0c;请kan 名片。 无货源模式&#xff1a;电商平台上的卖家不需要自己拥有实体的库存&#xff0c;而是通过与供应链服务提供商合作&#xff0c;将订单和支付…

ai写作软件怎么写文章?这篇文章介绍三个好方法

在人工智能技术的迅速发展下&#xff0c;ai写作成为创作领域的一项炙手可热的新技术。随着越来越多的创作者开始借助ai写作工具&#xff0c;ai写作逐渐引起了广泛的关注。ai写作是指利用人工智能技术和自然语言处理算法&#xff0c;为创作者提供文章的初版。不过有很多小伙伴对…

Linux用户权限管理

目录 一 权限定义 二 权限表示法 2.1 数字表示法 2.2 文字表示法 三 更改权限 四 权限ACL配置 五 特殊权限 5.1特殊权限SUID 5.2 特殊权限SGID 5.3 特殊权限Sticky 5.4 linux改变拥有者 一 权限定义 通过ll命令查看&#xff0c;然后摘出来一条分析&#xff1a; d …

PHPMySQL基础(二):通过PHP对MySQL进行增、删、改、查

PHP&MySQL基础&#xff08;一&#xff09;:创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 前面创建了一个数据库和表&#xff0c;并且用 mysqli()实例化了一个连接对象$link 这篇记一下怎么用实例化对象去对表进行一个增删改查操作 目录 一、连接数据库&#xf…