二叉树题目:翻转二叉树以匹配前序遍历

文章目录

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

题目

标题和出处

标题:翻转二叉树以匹配前序遍历

出处:971. 翻转二叉树以匹配前序遍历

难度

5 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root,二叉树中有 n \texttt{n} n 个结点,每个结点都有一个 1 \texttt{1} 1 n \texttt{n} n 之间的值且不同结点的值各不相同。另外给定一个由 n \texttt{n} n 个值组成的行程序列 voyage \texttt{voyage} voyage,表示预期的二叉树前序遍历结果。

通过交换结点的左右子树,可以翻转该二叉树中的任意结点。例如,翻转结点 1 \texttt{1} 1 的效果如下:

示例 0

请翻转最少的树中结点,使得二叉树的前序遍历与预期的遍历行程 voyage \texttt{voyage} voyage 相匹配

返回翻转的所有结点的值的列表。可以按任何顺序返回答案。如果不能,则返回列表 [-1] \texttt{[-1]} [-1]

示例

示例 1:

示例 1

输入: root = [1,2], voyage = [2,1] \texttt{root = [1,2], voyage = [2,1]} root = [1,2], voyage = [2,1]
输出: [-1] \texttt{[-1]} [-1]
解释:翻转结点无法令前序遍历匹配预期行程。

示例 2:

示例 2

输入: root = [1,2,3], voyage = [1,3,2] \texttt{root = [1,2,3], voyage = [1,3,2]} root = [1,2,3], voyage = [1,3,2]
输出: [1] \texttt{[1]} [1]
解释:翻转结点 1 \texttt{1} 1 交换结点 2 \texttt{2} 2 3 \texttt{3} 3,使得前序遍历可以匹配预期行程。

示例 3:

示例 3

输入: root = [1,2,3], voyage = [1,2,3] \texttt{root = [1,2,3], voyage = [1,2,3]} root = [1,2,3], voyage = [1,2,3]
输出: [] \texttt{[]} []
解释:前序遍历已经匹配预期行程,所以不需要翻转结点。

数据范围

  • 树中结点数目为 n \texttt{n} n
  • n = voyage.length \texttt{n} = \texttt{voyage.length} n=voyage.length
  • 1 ≤ n ≤ 100 \texttt{1} \le \texttt{n} \le \texttt{100} 1n100
  • 1 ≤ Node.val, voyage[i] ≤ n \texttt{1} \le \texttt{Node.val, voyage[i]} \le \texttt{n} 1Node.val, voyage[i]n
  • 树中的所有值各不相同
  • voyage \texttt{voyage} voyage 中的所有值各不相同

解法

思路和算法

二叉树的前序遍历的方法为:依次遍历根结点、左子树和右子树,对于左子树和右子树使用同样的方法遍历。对于每个结点,如果不翻转该结点,则遍历该结点之后依次遍历左子树和右子树,如果翻转该结点,则遍历该结点之后依次遍历右子树和左子树。由于题目要求翻转的结点数最少,因此只有当必须翻转结点的时候才翻转结点。当遍历到一个结点时,其子结点值和预期行程中的下一个值可能有以下情况。

  • 当前结点的左子结点为空或者左子结点值和预期行程中的下一个值相同,此时不需要翻转当前结点。

  • 当前结点的左子结点不为空且左子结点值和预期行程中的下一个值不同,如果不翻转当前结点则下一个访问的结点是左子结点,无法匹配预期行程,此时需要翻转当前结点。翻转当前结点之后不能保证匹配预期行程,而是需要访问原右子结点,判断当前结点的原右子结点值是否和预期行程中的下一个值相同,可能有以下两种情况。

    • 如果原右子结点值和预期行程中的下一个值相同,则翻转当前结点之后,原右子结点匹配预期行程,继续遍历判断其余的结点是否匹配预期行程。

    • 如果原右子结点值和预期行程中的下一个值不同,则翻转当前结点之后,仍无法匹配预期行程。由于当前结点无论是否翻转都无法匹配预期行程,因此无法通过翻转二叉树中的结点匹配预期行程。

根据上述分析,可以在二叉树前序遍历的基础上做修改,得到翻转的结点值列表。从根结点开始前序遍历二叉树,遍历过程中维护翻转的结点值列表并维护状态值记录是否存在翻转方案(不存在翻转方案表示无法通过翻转二叉树中的结点匹配预期行程),初始时翻转的结点值列表为空,状态值为存在翻转方案,具体做法如下。

  1. 如果当前结点为空或者状态值为不存在翻转方案,则直接返回。

  2. 如果当前结点值和预期行程中的当前值不同,则将翻转的结点值列表清空然后将 − 1 -1 1 加入翻转的结点值列表,并将状态值设为不存在翻转方案,然后返回。

  3. 根据当前结点的左右子结点,判断当前结点是否需要翻转,并决定遍历左右子树的顺序。

    • 如果当前结点的左子结点为空或者左子结点值和预期行程中的下一个值相同,则不需要翻转当前结点,依次对左子树和右子树前序遍历。

    • 否则,需要翻转当前结点,将当前结点值加入翻转的结点值列表,依次对右子树和左子树前序遍历。

遍历结束之后,即可得到翻转的结点值列表。如果存在翻转方案,则列表中的元素为所有需要翻转的结点值,特别地,当列表为空时,表示原二叉树已经匹配预期行程因此不需要翻转任何结点;如果不存在翻转方案,则列表中只有一个元素 − 1 -1 1

代码

class Solution {List<Integer> flips;int[] voyage;int n;int index;boolean possible;public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {this.flips = new ArrayList<Integer>();this.voyage = voyage;this.n = voyage.length;this.index = 0;this.possible = true;preorder(root);return flips;}public void preorder(TreeNode node) {if (node == null || !possible) {return;}if (node.val != voyage[index]) {flips.clear();flips.add(-1);possible = false;return;}index++;TreeNode left = node.left, right = node.right;if (left == null || left.val == voyage[index]) {preorder(left);preorder(right);} else {flips.add(node.val);preorder(right);preorder(left);}}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)。注意返回值不计入空间复杂度。

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

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

相关文章

单电源、轨到轨输入输出、高精度运放MS8551/8552/8554

产品简述 MS8551/8552/8554 是输入输出轨到轨的高精度运算放大器&#xff0c;它 有极低的输入失调电压和偏置电流&#xff0c;单电源电压范围为 1.8V 到 5V 。 轨到轨的输入输出范围使 MS8551/8552/8554 可以轻松地放大高 电平和低电平的传感信号。所有特性使得 MS8…

「薄荷绿」风电智慧运营,有效提高运营效率和能源利用率

随着能源需求的不断增加和全球变暖的加剧&#xff0c;人们对可再生能源的依赖程度不断提高。其中&#xff0c;风能作为一种可再生能源&#xff0c;其清洁、环保、无污染等特点备受青睐&#xff0c;其发展也越来越受到政府和企业的关注。然而&#xff0c;由于风能的不稳定性和不…

项目管理:为什么项目计划必不可少

项目管理计划定义了如何执行、监督和控制项目。项目计划让我们准确地知道在项目的每个阶段应该做什么&#xff0c;在哪里分配资源和时间&#xff0c;以及在事情超出计划或超出预算时要注意什么。 为了项目中获得成功&#xff0c;管理者需要在前期创建一个项目计划&#xff0c…

如何在 PyQt 中实现异步数据库请求

需求 开发软件的时候不可避免要和数据库发生交互&#xff0c;但是有些 SQL 请求非常耗时&#xff0c;如果在主线程中发送请求&#xff0c;可能会造成界面卡顿。这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单&#xff0c;且不会阻塞界面的异步请求方法。 实…

hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED

一、背景 要利用gpt产生的存放在es种的日志表做统计分析&#xff0c;通过hive建es的映射表&#xff0c;将es的数据拉到hive里面。 在最初的时候同事写的是全量拉取&#xff0c;某一天突然任务报错&#xff0c;但是没有错误日志一直报&#xff1a;Task Transitioned from NEW t…

Nature Communications 高时空分辨率的机器人传感系统及其在纹理识别方面的应用

前沿速览&#xff1a; 现有的触觉传感器虽然可以精确的检测压力、剪切力和应变等物理刺激&#xff0c;但还难以像人类手指一样通过滑动触摸&#xff0c;同时获取静态压力与高频振动来实现精确的纹理识别。为了解决这一问题&#xff0c;来自南方科技大学的郭传飞团队提出了衔接…

Angular 由一个bug说起之三:为什么时不时出现额外的水平/垂直滚动条?怎样能更好的防止它的出现?

目录&#xff1a; 什么是单元溢出 控制滚动条出现的属性 怎样能减少意外的滚动条出现 一、什么是单元溢出 在说到这个问题之前我们先简单阐述一下视图窗口(Viewport)和视图内容(View Content) 视图窗口简单来说就是呈现内容的视口&#xff0c;浏览器就是一个窗口&#xff…

安装Centos7

作者&#xff1a;余小小 下载VMware15 参考&#xff1a;http://t.csdnimg.cn/saS9S 下载镜像 这里使用网易镜像库下载 网易开源镜像站http://mirrors.163.com/ 网易Centos下载http://mirrors.163.com/centos/7.7.1908/isos/x86_64/ 安装Centos系统&#xff08;基础设施&…

C++初阶(十四)list

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、 list的介绍二、list的模拟实现1、list的节点2、list 的迭代器3、list4、打印5、完整代码…

[LeetCode]-283. 移动零-1089. 复写零

目录 283. 移动零 描述 解析 代码 1089. 复写零 描述 解析 代码 283. 移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &…

数据结构与算法编程题50

假设不带权有向图采用邻接矩阵G存储&#xff0c;设计实现以下功能的算法。 &#xff08;1&#xff09;求出图中每个顶点的出度。 &#xff08;2&#xff09;求出图中出度为0的顶点数。 &#xff08;3&#xff09;求出图中每个顶点的入度。 //参考博客&#xff1a;https://blog.…

想要精通GO语言?这些网站是你的最佳选择!

介绍&#xff1a;Go&#xff08;又称 Golang&#xff09;是由 Google 的 Robert Griesemer&#xff0c;Rob PGo&#xff08;又称 Golang&#xff09;是由 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。它在2009年11月10…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展&#xff0c;企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率&#xff0c;越来越多的企业开始选择使用ERP软件进行管理。然而&#xff0c;市场上现成的ERP软件并不能完全满足企业的需求&#…

兰州电力博物馆 | OLED透明展示台:创新展示,增强互动体验

产品&#xff1a;8片55寸OLED透明屏 应用场景&#xff1a;OLED透明屏利用其高透明度的特点&#xff0c;可以叠加在文物展示台上面&#xff0c;这种展示方式既让观众看到了文物原貌&#xff0c;又能了解其内部结构和细节特点&#xff0c;打破空间的束缚。 项目时间&#xff1a…

opencv知识库:cv2.add()函数和“+”号运算符

需求场景 现有一灰度图像&#xff0c;需求是为该图像增加亮度。 原始灰度图像 预期目标图像 解决方案 不建议的方案——“”运算符 假设我们需要为原始灰度图像的亮度整体提升88&#xff0c;那么利用“”运算符的源码如下&#xff1a; import cv2img_path r"D:\pych…

SCADA软件工具有多少免费的?

随着工业自动化的飞速发展&#xff0c;SCADA系统已经成为工业领域智能化转型绕不开的重要工具&#xff0c;不少个人和公司也都加入到了学习研究SCADA系统的队伍中。数维图小编耗费大量时间整理了国内外免费&#xff08;非完全免费&#xff09;的SCADA软件工具&#xff0c;有部分…

电源模块测试系统测试稳压电源 提升电源稳定性和可靠性

稳压电源是用来将不稳定的电压转换为稳定的输出电压的电子装置&#xff0c;其性能、稳定性和可靠性直接影响着工作状态。稳压电源测试是保证电子设备稳定工作的重要环节&#xff0c;那么如何测试稳压电源呢? 一、静态测试 静态测试是通过万用表或数字电压表测量稳压电源的输出…

ComplexHeatmap热图专栏 | 6. 3D热图绘制教程

本期教程 原文链接https://mp.weixin.qq.com/s/EyBs6jn78zOomcTv1aP52g 6 3D热图的绘制教程 基于《热图绘制教程》专栏&#xff0c;本教程已更新了5个章节&#xff0c;不知道大家是否有所收获。对于小杜个人来说&#xff0c;真的需要不断的复习和练习才可以记住&#xff0c;但…