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

文章目录

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

题目

标题和出处

标题:翻转等价二叉树

出处: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.xdnf.cn/news/141594.html

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

相关文章

【算法专题突破】二分查找 - x 的平方根(18)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:69. x 的平方根 - 力扣(LeetCode) 这道题就是求算数平方根, 要注意的点是他只需要保留整数部分,小数部分会舍去 2. 算法…

【HUAWEI】trunk和access两种链路模式实例

目录 🥮0.写在前面 🍣基本操作命令 🍣常见视图命令 🥮1、trunkaccess 🍣1.1、拓扑图 🍣1.2、操作思路 🍣1.3、配置操作 🍡1.3.1、LSW1配置 🍡1.3.2、LSW2配置 &#x1f3…

单列集合顶层接口Collection

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 集合体系结构 一、单列集合顶层接口Collect…

全面提升AD域安全认证 | 竹云IDaaS

传统的微软Active Directory目录已无法适应企业多样化的业务需求,借助身份云您可以快速整合企业本地、云端资源,从而使AD域管理变得更简单、安全、高效。 企业面临的挑战 AD域无法整合现代化系统 AD域仅支持 LDAP 、Kerberos 协议,不能整合…

数据结构-----串(String)详解

目录 前言 1.串的定义 相关类型 2.串的储存结构 顺序储存表示 堆分配储存表示 块链储存表示 3.串的操作方式 4.串的匹配算法 (1)BF算法 过程原理 代码实现(C/C) 算法分析 (2)KMP算法 过程…

红米note13 秒解锁BL 跳过168 秒解锁BL,红米Redmi Note 13 Pro+ 系列 无需等待168小时,刷入magisk教程 刷机包下载

最近入手了一台红米note13,发现需要等待168小时才能解锁BL,这让我感到非常困扰。不过,经过一番研究,我发现了一个秒解锁BL的方法,无需等待168小时,而且还可以刷入magisk,非常方便。 首先&#x…

【NetEQ】读 《白话解读 WebRTC 音频 NetEQ 及优化实践》学习笔记

白话解读 WebRTC 音频 NetEQ 及优化实践webrtc 的重要模块 官方文档 :转载请标明出处:大神翻译 大神地址 : https://blog.csdn.net/lhl_blog/article/details/10993605GIPS NetEQ概述 GIPS NetEQ是一项专为IP电信系统开发的高级语音质量处理技术,其能够在大幅提高语音质量的…

【Ubuntu18.04】Autoware.ai安装

Autoware.ai安装 1 ROS安装2 Ubuntu18.04安装Qt5.14.23 安装GCC、G4 Autoware安装与编译4.1 针对Ubuntu 18.04 / Melodic的依赖包安装4.2 Autoware环境搭建4.3 运行 Autoware4.4 ROSBAG Demo 1 ROS安装 参考笔者的博客即可:【ROS】Ubuntu18.04安装Ros 2 Ubuntu18.…

mock.js与组件通信之总线的讲解

目录 一Mock.js 1.1简介 1.2 安装配置Mock.js 1.3 mock.js的使用 二. 组件通信之总线 2.1 总线的简介 2.2 总线的使用-以导航栏的收进为例 好啦今天的分享就到这啦!! 一Mock.js 1.1简介 Mock.js 是一个用于生成随机数据的 JavaScript 库。它可以模拟…

蓄水池抽样算法

题目:在一个源源不断的数据流中,会吐出带有编号的球,现在问你 在不知道具体有多少个球的情况下,如何等概率的抽出10个球? 例题:leetcode 382题 应用场景:比如在某个游戏的抽奖活动中&#xff…

vue点击pdf文件直接在浏览器中预览文件

好久没有更新文章了,说说为什么会有这篇文章呢,其实是应某个热线评论的要求出的,不过由于最近很长一段时间没打开csdn现在才看到,所以才会导致到现在才出。 先来看看封装完这个预览方法的使用,主打一个方便使用&#x…

Purple-Pi-OH Linux SDK编译手册

一、 SDK下载 1.1 源码下载 在官网下载Purple-Pi-OH的的相关资料以及Linux SDK: 链接:Purple Pi OH-深圳触觉智能科技有限公司 1.2 源码解压 由于SDK打包后体积较大,我们在上传到百度云盘前把SDK包按照4GB大小分割了,因此下载…

基于物联网的农村地区智能微电网系统(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

肖sir__mysql中数据库后端无法展示

mysql中数据库后端无法展示: 错误现象 解决方法: mysql中数据库后端无法展示:my.cnf (5,7数据库) 在 mysql 配置文件中加入: sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 或者重启数据库

Mac配置iTerm样式终端

一、MacOs系统 MacOs中终端使用iTerm2 1. 配置oh-my-zsh oh my zsh 的地址: https//github.com/ohmyzsh/ohmyzsh 插件存放位置:~/.oh-my-zsh/plugins 下载常用的插件 git clone http://github.com/zsh-users/zsh-syntax-highlighting.git 修改配…

STC15F104W控制3个74HC595芯片输出数码管显示

一、74HC595脚位图及说明 管脚说明: 14脚:DS(SER),串行数据输入引脚 13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND 12脚:RCK(STCP&…

基于SpringBoot的可以做毕设或者课设的实时聊天系统(仿微信)

技术栈 前后端分离前端使用: Vue Element后端使用: SpringBoot Mysql8.0 Mybatis WebSocket 功能 登录和注册页 登录 和 注册 修改个人信息页 修改个人信息 消息列表页 展示最近半年的聊天信息,删除聊天记录 搜索好友和群页 搜索JJ号来找到 群/好友 好友信息详情页…

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

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

前端VUE---JS实现数据的模糊搜索

实现背景 因为后端实现人员列表返回&#xff0c;每次返回的数据量在100以内&#xff0c;要求前端自己进行模糊搜索 页面实现 因为是实时更新数据的&#xff0c;就不需要搜索和重置按钮了 代码 HTML <el-dialogtitle"团队人员详情":visible.sync"centerDi…

odoo16 取消“系统各功能状态日报”的邮件

odoo16默认情况下每周都会发送一个“系统各功能状态日报”的邮件&#xff0c;而且是所有人都发&#xff0c; 这个功能在哪配置呢&#xff1f; 今天研究了一下&#xff0c; 线索是“系统各功能状态日报”&#xff0c;先全文检索吧 #. module: digest #: model:digest.digest,na…