二叉树题目:翻转等价二叉树

news2024/11/19 9:32:29

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:翻转等价二叉树

出处:951. 翻转等价二叉树

难度

4 级

题目描述

要求

对于二叉树,我们可以定义如下翻转操作:选择任意结点,然后交换其左子树和右子树。

对于两个二叉树 X 和 Y,当且仅当经过一定次数的翻转操作之后能使 X 等于 Y 时,二叉树 X 翻转等价于二叉树 Y。

给定两个二叉树的根结点 root1 \texttt{root1} root1 root2 \texttt{root2} root2,如果两个二叉树翻转等价,则返回 true \texttt{true} true,否则返回 false \texttt{false} false

示例

示例 1:

示例 1

输入: root1   =   [1,2,3,4,5,6,null,null,null,7,8],   root2   =   [1,3,2,null,6,4,5,null,null,null,null,8,7] \texttt{root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]} root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]
输出: true \texttt{true} true
解释:我们翻转值为 1 \texttt{1} 1 3 \texttt{3} 3 以及 5 \texttt{5} 5 的三个结点。

示例 2:

输入: root1   =   [],   root2   =   [] \texttt{root1 = [], root2 = []} root1 = [], root2 = []
输出: true \texttt{true} true

示例 3:

输入: root1   =   [],   root2   =   [1] \texttt{root1 = [], root2 = [1]} root1 = [], root2 = [1]
输出: false \texttt{false} false

数据范围

  • 树中结点数目在范围 [0,   100] \texttt{[0, 100]} [0, 100]
  • 树中每个结点的值都是范围 [0,   99] \texttt{[0, 99]} [0, 99] 内的唯一值

解法

思路和算法

由于每次翻转操作只会将选定结点的左子树和右子树交换,不会改变选定结点的值,因此如果两个二叉树翻转等价,则这两个二叉树的根结点一定满足以下两种情况之一。

  1. 两个二叉树的根结点都为空,即两个二叉树都为空。

  2. 两个二叉树的根结点都不为空且两个二叉树的根结点值相同。

对于第 1 种情况,由于两个二叉树都为空,因此两个二叉树翻转等价。对于第 2 种情况,需要继续对两个二叉树的左子树和右子树判断是否满足翻转等价。

由于根结点可能不翻转或翻转,因此当两个二叉树翻转等价时,可能有以下两种情况。

  1. 根结点不翻转,则第一个二叉树的左子树和第二个二叉树的左子树翻转等价,且第一个二叉树的右子树和第二个二叉树的右子树翻转等价。

  2. 根结点翻转,则第一个二叉树的左子树和第二个二叉树的右子树翻转等价,且第一个二叉树的右子树和第二个二叉树的左子树翻转等价。

由于两个二叉树是否翻转等价取决于两个二叉树的左子树和右子树之间是否存在翻转等价的关系,因此可以使用深度优先搜索实现,整个过程是一个递归的过程。

如果两个二叉树的根结点都为空,则两个二叉树翻转等价。如果两个二叉树的根结点只有一个为空,则两个二叉树不翻转等价。这两种情况是递归的终止条件。

对于其余情况,首先判断两个二叉树的根结点值是否相同,然后执行递归。

  1. 如果两个二叉树的根结点值不同,则两个二叉树不翻转等价。

  2. 如果两个二叉树的根结点值相同,则对两个二叉树的左子树和右子树调用递归。

代码

class Solution {
    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        if (root1 == null && root2 == null) {
            return true;
        }
        if (root1 == null || root2 == null) {
            return false;
        }
        return root1.val == root2.val && ((flipEquiv(root1.left, root2.left) && flipEquiv(root1.right, root2.right))
                || (flipEquiv(root1.left, root2.right) && flipEquiv(root1.right, root2.left)));
    }
}

复杂度分析

  • 时间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。虽然有两个递归调用分支(分别对应根结点不翻转和翻转),但是由于每个二叉树中的结点值各不相同,因此实际只会执行一个递归调用分支,每个结点被访问一次。

  • 空间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度等于结点数。

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

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

相关文章

【app篇】写个简单的BLE调试app,练练手,同时为后续调试ESP32 BLE做个支持

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-09-25 ❤️❤️ 本篇更新记录 2023-09-25 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝&#x1f64…

5、Nacos服务注册服务端源码分析(四)之NotifyCenter

上篇我们讲server端处理服务注册源码时,遇到了一个关键类NotifyCenter,本篇就主要来分析下这个类。 NotifyCenter 这个类所在包:nacos-common /*** Unified Event Notify Center.*/通过类注释可以看出来这个类是一个统一的事件通知中心&am…

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法,我们把构造方法和析构方法这两个方法分开来讲: 1、构造方法 构造方法存在于每个声明的类中,主要作用是执行一些初始化任务。如果类中没有直接声明构造方法,那么类会默认地生成一个没…

仿网吧游戏菜单-超好用

GG软件菜单(X64)仿网吧菜单: https://url75.ctfile.com/f/1834175-943877085-2d844a?p6775 (访问密码: 6775)

如何将前后端分离的项目部署在服务器上

宝塔Linux部署: 因为要部署前端我们先下个nigx Tomcat,下载这个只是为了java,它里面包含java的 前端 在去添加站点,域名暂时是自己的公网 然后打开新建的站点,把里面的文件全删掉,再把自己的前端dist里的文件全选拖…

高速USB转8路RS422串口

基于480Mbps 高速USB转8路串口芯片CH348,可以为各类主机扩展出8个独立的串口。使用厂商提供的VCP串口驱动程序,可支持Windows、Linux、Android、macOS等操作系统。使用单个CH348芯片即可实现USB一拖八串口转接产品,高速USB收发器和控制器、高…

SpringCloud 简单的了解

什么是SpringCloud ? 基于 Spring Boot 的 Spring 集成应用程序,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,提供与外部系统的集成。 如服务注册与发现、配置中心、负载均衡、断路器、消息总线、数据监控等;换句话说&#xff…

拼多多商品详情数据接口

拼多多商品详情接口的具体内容。获取拼多多商品详情,可以参考如下方式: item_get_app-根据ID取商品详情原数据接口包括:标题,价格,促销价,优惠券,库存,销量,详情图片&am…

Android开发之状态栏的设置

Android页面开发通常是根据UI设计进行,真机会遇到顶部状态栏和页面背景色或背景图片不协调的情况,这时候需要对状态栏进行设置。默认状态栏是有固定高度和背景色的,基本上我们需要将状态栏背景色设置透明并且图标能够在页面显示,下…

【项目实战】Linux系统下jar包自启动

什么是jar包自启动 在Linux系统中,"jar包自启动"是指通过配置将Java程序打包成可执行的Jar文件,并设置其在系统启动时自动运行。以下是与jar包自启动相关的一些概念: Jar文件:Jar(Java Archive&#xff09…

Postgresql事务测试

参考一个事务中 可以查询自己未提交的数据吗_最详细MySQL事务隔离级别及原理讲解!(二)-CSDN博客 一个事务中 可以查询自己未提交的数据吗_趣说数据库事务隔离级别与原理_weixin_39747293的博客-CSDN博客 【MySql:当前读与快照读…

虚拟机与物理机之寄生贴贴

虚拟机 虚拟机指通过【软件模拟的】、【具有完整硬件系统功能的】、【运行在一个完全隔离环境中的】完整计算机【系统】。它是一个系统,一个挂在物理机上的系统,也就是“寄生”在别人身上的东西。可以称为“寄生兽” 物理机 物理机,是真实…

uni-app使用HBuilder X编辑器本地打包apk步骤说明

1.下载安装Android Studio 下载地址官方地址:Android Studio 下载文件归档 | Android 开发者 | Android Developers 安装Android SDK和Google USB Driver即可,后者主要是为了后期使用USB设置的,如果不需要可以不点。 2.下载uni-app提供…

适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几个突出的问题: 1)线下CTF比赛培训中存在严重的“最后一公里”问题&#xf…

工具学习--easyexcel-3.x 使用--写入基本使用,自定义转换--动态表头以及宽设置-

写在前面: easyexcel是alibaba开发简单导出未excel的工具。使用的情况还是比较多的。 文章目录 依赖导入写Excel快速入门对象设置ExcelProperty设置列属性ExcelIgnore 忽视列宽、行高格式转换时间格式化数字格式化自定义格式化 合并单元格其他更加个性化需求动态表…

简单理解旁路电容和去耦电容

1、本文内容如有错误,欢迎交流指正。 2、本文仅作为本人学习笔记,部分内容来源于网络、书籍,如涉及侵权,请联系删除。 什么是旁路电容? 旁路电容的英文原文是Bypass capacitor,bypass就是绕过,避…

《DATASET CONDENSATION WITH GRADIENT MATCHING》

本文提出了一种用于数据效率学习的训练集合成技术,称为“数据集凝聚”(Dataset),它学习将大数据集压缩成一个小的信息合成样本集,用于从头开始训练深度神经网络。我们将这个目标表述为在原始数据和合成数据上训练的深度神经网络权值的梯度之间…

sizeof与strlen区别

一、sizeof与strlen区别 sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小 strlen是函数,参数类型必须是字符型指针(char…

检验过程管理

声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则,监测准备、监测实施、监测效果评价 与反馈等过程指导…

vue在el-tab中使用echart(出现canvas高宽一直是100px问题+echart随外层div变化而自适应)

问题1:canvas高宽一直是100px问题 解决方法:使用v-if,参考文献https://blog.csdn.net/qq_42527726/article/details/106147539?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-106147539-blog-132323416.235^…