二叉树题目:翻转二叉树

文章目录

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

题目

标题和出处

标题:翻转二叉树

出处:226. 翻转二叉树

难度

3 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,翻转二叉树,并返回其根结点。

示例

示例 1:

示例 1

输入: root = [4,2,7,1,3,6,9] \texttt{root = [4,2,7,1,3,6,9]} root = [4,2,7,1,3,6,9]
输出: [4,7,2,9,6,3,1] \texttt{[4,7,2,9,6,3,1]} [4,7,2,9,6,3,1]

示例 2:

示例 2

输入: root = [2,1,3] \texttt{root = [2,1,3]} root = [2,1,3]
输出: [2,3,1] \texttt{[2,3,1]} [2,3,1]

示例 3:

输入: root = [] \texttt{root = []} root = []
输出: [] \texttt{[]} []

数据范围

  • 树中结点数目在范围 [0, 100] \texttt{[0, 100]} [0, 100]
  • -100 ≤ Node.val < 100 \texttt{-100} \le \texttt{Node.val} < \texttt{100} -100Node.val<100

解法一

思路和算法

如果二叉树为空,则空二叉树翻转之后仍为空二叉树,不需要执行翻转操作。

当二叉树不为空时,翻转二叉树的操作为首先交换根结点的左右子树,然后对左右子树分别翻转。

翻转二叉树的过程是一个递归的过程,递归的终止条件是当前二叉树为空。当二叉树不为空时,首先交换当前二叉树的左右子树,然后对左右子树调用递归完成翻转,即可完成二叉树的翻转。

代码

class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}TreeNode left = root.left;TreeNode right = root.right;root.left = right;root.right = left;invertTree(root.left);invertTree(root.right);return root;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次,对于每个结点交换左右子树的时间都是 O ( 1 ) O(1) O(1)

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

解法二

思路和算法

由于翻转二叉树等价于对二叉树中的每个结点交换左右子树,因此基于该思路,也可以使用广度优先搜索翻转二叉树。

初始时将根结点入队列,遍历过程中,每次将一个结点出队列,对于每个访问到的结点,将其左右子树交换,然后将非空子结点入队列继续遍历,直到队列为空时遍历结束,此时二叉树翻转完毕。

代码

class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();TreeNode left = node.left, right = node.right;node.left = right;node.right = left;if (right != null) {queue.offer(right);}if (left != null) {queue.offer(left);}}return root;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次,对于每个结点交换左右子树的时间都是 O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

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

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

相关文章

DAY39:贪心算法(八)无重叠区间+划分字母区间+合并区间

文章目录 435.无重叠区间思路完整版注意点 右区间排序 763.划分字母区间思路完整版如何确定区间分界线debug测试时间复杂度 总结 56.合并区间&#xff08;写法1比较考验思维&#xff0c;推荐写法2&#xff09;思路写法1&#xff1a;直接在原数组上修改&#xff0c;更新i-1debug…

深兰科技发布《深兰数字智能产业系列报告(2023年):个人数字化》

近日&#xff0c;深兰科技发布《深兰数字智能产业系列报告(2023年)&#xff1a;个人数字化》&#xff0c;这是深兰科技在数字智能产业领域发布的首份研究报告&#xff0c;也是国内第一份个人数字化产业报告。此报告是在上海市经济和信息化委员会和上海市产业技术创新促进会的共…

【Redis】配置

&#x1f3af;Redis 配置 Redis 的配置文件位于 Redis 安装目录下&#xff0c;文件名为 redis.conf(Windows 名为 redis.windows.conf)。 1、查看配置 语法如下通过 config get 命令查看或设置配置项。 CONFIG GET 配置的名字 使用 * 号获取所有配置项 127.0.0.1:6379>…

IDEA使用教程 安装教程

16. Codota 插件 Codota 插件可以根据使用频率优先显示较常用的类和方法。然而&#xff0c;是否使用该插件取决于个人的偏好。有时工具只能作为参考&#xff0c;仍然需要依靠个人记忆来确保准确性。 17. 快速查看类和字段的注释 按下 F2 键可以快速查看某个类或字段的文档注…

stm32(定时器和PWM知识点)

一、定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz { unsigned char i, j, k; _nop_(); i 4; j 129; k 119; do { do { while (--k); } while (--j); } while (--i); }定时器工作原理&#xff1a; 使用精准的时基&#xff0c…

赛效:怎么将PPT转为PDF

1&#xff1a;在电脑网页上打开云组件&#xff0c;点击“PPT转换”菜单里的“PPT转PDF”。 2&#xff1a;点击“选择文件”可以将本地PPT文件添加上去。 3&#xff1a;文件添加成功后&#xff0c;点击下方的“开始转换”按钮。 4&#xff1a;文件转换成功后&#xff0c;在预览页…

如何将京东商品复制上传到lazada店铺(阿里巴巴卖家必看的操作指南)

Lazada是东南亚市场的电商平台&#xff0c;因为它的入驻门槛比较低&#xff0c;并且有巨大的流量吸引了很多商家的入驻&#xff0c;那商家入驻之后要怎么上货呢?接下来我们就来给大家讲解一下这方面的内容。 本文主要介绍如何将商品上传到lazada&#xff0c;包括如何注册账号、…

centos7安装jenkins

引言 jenkins安装大家可以按照jenkin官网的步骤直接执行就可以&#xff0c;如下图&#xff1a; 不过由于我想使用jdk8&#xff0c;因此采用自己下载安装包的方式进行 首先创建jenkins安装目录&#xff1a; mkdir -p /usr/local/jenkins然后下载安装包&#xff1a; wget ht…

消息队列 - RocketMQ

1. 名词解释和概念 NameServer&#xff1a; 是一个无状态节点&#xff0c;可集群部署&#xff0c;节点之间无任何信息同步用于服务注册和发现&#xff0c;为 MQ 集群提供服务协调与治理记录并维护 Topic 和 Broker 的信息为生产者和消费者提供 Topic 的路由信息 无状态和有状…

就因为这7大误区,我自学好久,但编程迟迟不能入门!

学编程的误区 就因为这7大误区&#xff0c;自学编程迟迟不能入门&#xff01; 觉得编程好难学的同学&#xff0c;评论区告诉我&#xff01; 这一篇文章&#xff0c;告诉你。 我这么多年都踩过&#xff0c;哪些自学编程的坑&#xff01; 如果你&#xff0c;也在自学编程&am…

港联证券|dmi指标的用法和实战技巧?

DMI指标是一种技术分析工具&#xff0c;可用于评估股票、期货和外汇市场的趋势强度。DMI指标由三条线组成&#xff0c;分别是DI&#xff08;上升方向指标&#xff09;、-DI&#xff08;下降方向指标&#xff09;和ADX&#xff08;平均趋向指数&#xff09;。在使用DMI指标之前&…

flutter开发实战-多语言flutter intl

flutter开发实战-多语言flutter intl 之前做的应用中有用到多语言&#xff0c;一直没有整理&#xff0c;这里整理一下多语言设置流程。 使用的是Android studio 一、flutter_intl 插件 使用Android studio安装flutter_intl 插件&#xff0c;更新或者安装flutter_intl 插件后…