LeetCode题练习与总结:翻转二叉树--226

一、题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

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

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

二、解题思路

这个问题可以通过递归的方式来解决。递归是一种常用的树结构处理方法,它能够将问题分解为更小的子问题。对于翻转二叉树这个问题,我们可以这样思考:

  1. 对于任意一个节点,我们首先翻转它的左右子树。
  2. 然后将这个节点的左右子树交换位置。

递归的终止条件是当前节点为空,即到达了叶子节点的子节点,此时不需要做任何操作。

三、具体代码

class Solution {public TreeNode invertTree(TreeNode root) {// 递归终止条件,如果当前节点为空,直接返回if (root == null) {return null;}// 递归翻转当前节点的左右子树TreeNode left = invertTree(root.left);TreeNode right = invertTree(root.right);// 交换当前节点的左右子树root.left = right;root.right = left;// 返回当前节点,此时它的左右子树已经被翻转return root;}
}

这段代码首先检查当前节点是否为空,如果为空则直接返回。如果不为空,则递归调用 invertTree 方法翻转左右子树,然后将左右子树交换。最后返回当前节点,这时当前节点的左右子树已经翻转完成。由于每次递归调用都会交换子树,所以整棵树的所有节点都会被正确翻转。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 递归方法 invertTree 对于每个节点都会被调用一次,并且每次调用都会访问一次该节点的左右子节点。因此,每个节点都会被访问一次,总的访问次数与节点数成正比。
  • 在二叉树中,每个节点除了根节点外,都有且仅有一个父节点,所以所有节点的入栈和出栈操作总共会被执行2N次(N为树中节点的数量),因此时间复杂度为O(N),其中N是树中节点的数量。
2. 空间复杂度
  • 递归方法的空间复杂度主要取决于递归调用栈的深度,而递归调用栈的深度在极端情况下(即树完全倾斜时)等于树的高度。
  • 在最坏情况下,树可能是一条链表,其高度为N(N为树中节点的数量),此时递归调用栈的深度也为N,因此空间复杂度为O(N)。
  • 在平均情况下,一棵完全平衡的二叉树的高度大约是log(N),因此递归调用栈的深度也是log(N),此时空间复杂度为O(log(N))。

综上所述:

  • 时间复杂度:O(N),其中N是树中节点的数量。 
  • 空间复杂度:最坏情况下为O(N),平均情况下为O(log(N))。

五、总结知识点

  1. 类定义:代码定义了一个名为 Solution 的类,这是Java面向对象编程的基本单位。

  2. 方法定义:在 Solution 类中定义了一个名为 invertTree 的公共方法,它接受一个 TreeNode 类型的参数并返回一个 TreeNode 类型的结果。

  3. 递归invertTree 方法使用递归算法来遍历和翻转二叉树。递归是一种自我调用的算法,用于解决能够分解为更小相似问题的问题。

  4. 递归终止条件:递归算法通常有一个或多个终止条件,以防止无限递归。在这个方法中,如果当前节点 root 为 null,则直接返回 null,这是递归的终止条件。

  5. 引用传递:方法参数 TreeNode root 是通过引用传递的,这意味着在方法内部对 root 的修改会影响到原始的树结构。

  6. 二叉树操作:代码涉及了二叉树的基本操作,包括访问节点的左右子节点以及修改节点的左右子节点。

  7. 节点交换:通过简单的赋值操作,实现了节点左右子树的交换,这是翻转二叉树的核心步骤。

  8. 返回值:在递归的每一步中,都会返回当前节点,以便在递归回溯时保持树结构的完整性。

  9. 递归调用栈:虽然代码中没有直接体现,但在递归过程中会隐式地使用调用栈来保存每次递归调用的状态。

  10. 类型声明:代码中使用了 TreeNode 类型,这是一个自定义的数据结构,表示二叉树的节点,包含整数值 val 以及指向左右子节点的引用 left 和 right

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

QT学习——知识篇

一、qt的ui界面是什么 Qt的UI界面通常指的是使用Qt框架开发的用户界面。Qt是一个跨平台的C图形用户界面库&#xff0c;它提供了丰富的控件和布局&#xff0c;以及用于处理事件和用户交互的机制。在Qt中&#xff0c;UI界面通常是通过Qt Designer工具设计的&#xff0c;然后转换成…

<<编码>> 第 11 章 逻辑门电路(Gates)--猫咪选择电路 示例电路

使用门电路的猫咪选择电路 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch11-16-cat-circuit-with-gate.txt 集成的猫咪选择电路 in…

基于51单片机的台灯控制(Proteus仿真)

基于51单片机的台灯控制系统以AT89C51为主控&#xff0c;使用LCD1602作为系统主控&#xff0c;借助ADC0832进行ADC转换&#xff0c;获取光敏传感器的值&#xff0c;灯光颜色共有三种&#xff0c;分别是红绿蓝&#xff0c;系统有两种控制方式&#xff0c;一种是蓝牙控制&#xf…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二集:通过InControl插件实现绑定玩家输入以及制作小骑士移动空闲动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…

HBase在大数据实时处理中的角色

HBase是一个分布式的、面向列的开源NoSQL数据库&#xff0c;它建立在Hadoop的HDFS之上&#xff0c;被设计用于处理大规模数据集。HBase非常适合于需要随机实时读写访问的应用程序&#xff0c;例如大数据分析、数据仓库和实时数据处理等场景。本文将探讨HBase是如何进行大数据实…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(中)

虚幻引擎 | &#xff08;类恐鬼症&#xff09;玩家和NPC语音聊天-CSDN博客 上篇偏重实现步骤&#xff0c;中篇偏重校准和降低延迟&#xff0c;下篇优化上下文和口音 TTS通用参数 ——————————————————————————————————————————— 以…

传统Malmquist-Luenberger指数与全局Malmquist-Luenberger指数的区别

1.全局技术前沿的构建 1.1传统ML指数 技术前沿的时间依赖性 传统的Malmquist-Luenberger&#xff08;ML&#xff09;指数在每个时期&#xff08;例如年份&#xff09;单独构建各自的技术前沿。这意味着每个时期的生产可能性集合和技术效率都是基于该时期的数据。 不可比性问…

基于SpringBoot+Vue+MySQL的IT技术交流和分享平台

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化转型的浪潮中&#xff0c;构建一个基于SpringBoot、Vue.js与MySQL的IT技术交流与分享平台显得尤为重要。该平台旨在汇聚广大IT从业者、开发者及爱好者&#xff0c;提供一个高效、便捷的线上空间&#xff0c;用于分享最新…

【笔记】1.2 弹性变形

文章目录 一、弹性变形及实质二、胡克定律1. 单向拉伸2. 剪切和扭转3. E、G和v的关系 三、弹性模量弹性模量的影响因素第二相铸铁石墨形态塑性变形温度影响不明显 四、弹性比功弹性比功表示 五、滞弹性弹性体纯弹性体实际弹性体 主要特征和机制延迟反应内部结构影响因素 弹性滞…

性能测试【Locust】基本使用介绍

一.前言 Locust是一款易于使用的分布式负载测试工具&#xff0c;基于事件驱动&#xff0c;使用轻量级执行单元&#xff08;如协程&#xff09;来实现高并发。 二.基本使用 以下是Locust性能测试使用的一个基础Demo示例&#xff0c;该示例有安装Locust、编写测试脚本、启动测…

王者荣耀改重复名(java源码)

王者荣耀改重复名 项目简介 “王者荣耀改重复名”是一个基于 Spring Boot 的应用程序&#xff0c;用于生成王者荣耀游戏中的唯一名称。通过简单的接口和前端页面&#xff0c;用户可以输入旧名称并获得一个新的、不重复的名称。 功能特点 生成新名称&#xff1a;提供一个接口…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化&#xff08;ASLR&#xff09;设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.ccreateBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客&#xff0c;大家可以先看看栈溢出基础。…

redis的基础数据结构-list列表

文章目录 1. redis的list数据结构1.1. list结构的特性1.2. 常用命令 2. 常见业务场景2.1 消息队列案例讲解背景优势解决方案代码实现 2.2 排行榜案例讲解背景优势解决方案代码实现 3. 注意事项&#xff1a; 1. redis的list数据结构 参考链接&#xff1a;https://mp.weixin.qq.…

Java面试篇基础部分-Java创建线程详解

导语   多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让…

【算法】-单调队列

目录 什么是单调队列 区域内最大值 区域内最小值 什么是单调队列 说到单调队列&#xff0c;其实就是一个双端队列&#xff0c; 顾名思义&#xff0c;单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增&#xff08;或递减&#xff09;。「队列」指…

2.5 ADC模数转换

文章目录 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器AD转换的步骤 与 时间stm32ADC的转换模式 ADC框图stm32的ADC引脚配置stm32ADC的步骤 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转…

c#引用同一命名空间下的其他类

总体结构 Class1的内容 using System.Windows.Forms; namespace demo1 {internal class Class1{public class HelperClass{public void DoSomething(){MessageBox.Show("Doing something useful..."); } }} }Class2的内容 using System.W…

【C++ Primer Plus习题】16.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> #inc…

基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

目的是利用YOLOV8这一先进的深度学习技术&#xff0c;开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注&#xff0c;我们训练了YOLOV8模型&#xff0c;使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为&#…

Ruoyi Cloud K8s 部署

参考 https://blog.csdn.net/Equent/article/details/137779505 https://blog.csdn.net/weixin_48711696/article/details/138117392 https://zhuanlan.zhihu.com/p/470647732 https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/morecccc/article/details/1…