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

news2025/1/11 10:06:34

一、题目描述

给你一棵二叉树的根节点 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.coloradmin.cn/o/2134003.html

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

相关文章

可维护性例题2

答案&#xff1a;C 解析&#xff1a; 选项A 维护性是软件质量的重要指标 选项B 软件开发受软件开发文档因素影响&#xff0c;因此受开发文档影响 选项C 维护占软件开发的比较长的时期 选项D 说法正确

【Python爬虫系列】_020.异步协程asyncio

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…

水壶问题00

题目链接 水壶问题 题目描述 注意点 1 < x, y, target < 1000 解答思路 首先想到的是深度优先遍历&#xff0c;对于任意一个状态&#xff0c;可以有以下六种操作&#xff1a; 将x水壶中的水倒空将y水壶中的水倒空将x水壶灌满将y水壶灌满将x水壶中的水倒给y水壶&…

Leetcode3275. 第 K 近障碍物查询

Every day a Leetcode 题目来源&#xff1a;3275. 第 K 近障碍物查询 解法1&#xff1a;大根堆 维护前 k 小元素&#xff0c;可以用最大堆。 遍历数组 queries&#xff0c;计算点 (x,y) 到原点的曼哈顿距离 d∣x∣∣y∣。 把 d 入堆&#xff0c;如果堆大小超过 k&#xff…

OpenAI o1来是来了,但...

北京时间昨天凌晨&#xff0c;OpenAI正式发布了o1&#xff0c;这次来是来了&#xff0c;但...结合前一阵的思考和环境&#xff0c;说一下自己的感想吧&#xff1a; Ⅰ. 感觉OpenAI要有朝着Close一条道走到黑的趋势了..且看起来Close的很蹩脚(原因见下)&#xff0c;在这种Close下…

杂七杂八-部署框架

杂七杂八-部署框架 docker docker dockerhub&#xff1a;Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像 仅个人笔记使用&#xff0c;感谢点赞关注 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注与支持&…

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武…

基于python+django+vue的农业管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…

Linux 防火墙:iptables (二)

文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;…

精益思维如何在医疗电子领域实现持续创新?

随着科技的飞速发展&#xff0c;医疗电子设备不仅要求更高的技术精度和稳定性&#xff0c;还需满足日益增长的个性化需求&#xff0c;而精益思维正是实现这一目标的有效途径。 精益思维起源于制造业&#xff0c;强调以最小的资源投入获得最大的运营效益。在医疗电子领域&#x…

口腔助手系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;预约信息管理&#xff0c;口腔历史管理&#xff0c;用户反馈管理&#xff0c;在线问诊管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&a…

堆叠沙漏网络(stacked hourglass network)学习

定义 Stacked Hourglass Networks是2016年密歇根大学提出的经典网络架构。是曾经最具代表性的姿态识别SOTA之一。 hourglass network hourglass network 本身其实可以理解成是一个encoder-decoder的结构&#xff0c;encoder最大程度的提取图像在每一个scale的特征以及空间信…

系统架构设计师 - 项目管理

项目管理 项目管理&#xff08;1-3分&#xff0c;案例分析 25分&#xff09;立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…

卷积神经网络经典模型架构简介

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) ImageNet是一个包含超过1 500万幅手工标记的高分辨率图像的数据…

windows C++-并行编程-并行算法(四)- 并行排序

并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 PPL 提供三种排序算法&#xff1a;concurrency::parallel_sort、concurrency::parallel_buffered_sort 和 concurrency::parallel_radix…

量化投资策略_因子打分选股的案例实现

一&#xff1a;因子打分选股的介绍 因子打分选股是一种量化投资策略&#xff0c;它通过选取多个与股票收益率相关的因子&#xff0c;对股票进行综合评分&#xff0c;然后根据评分来选择股票构建投资组合。以下是构建多因子打分选股模型的一般步骤&#xff1a; 数据预处理&…

Gitlab备份、迁移、恢复和升级(Gitlab Backup, migration, recovery, and upgrade)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

2020-10-22 1-N间整数转二进制记其0个数

缘由c语言对于给定的十进制整数N&#xff08;N<10000),将1到N&#xff08;含N&#xff09;之间的每个整数转成二进制……&#xff08;遇到一个题&#xff0c;我写了一段代码&#xff0c;但怎么也编译不出来&#xff0c;不知道哪里错了&#xff0c;萌新求大神指教&#xff01…

MATLAB移动目标检测与追踪系统

MATLAB移动目标检测与追踪系统 项目描述 本项目旨在开发一个基于MATLAB的移动目标检测与追踪系统&#xff0c;该系统利用相邻帧间差分法、背景差分法以及光流法来检测视频中的移动目标&#xff0c;并能够对这些目标进行追踪。系统无需安装额外的工具包&#xff0c;可以直接在…

网络的一些基本概念

目录 ♫网络发展历程 ♪独立模式 ♪网络互连 ♪局域网 ♪广域网 ♫网络通讯的基础 ♫IP地址 ♪什么是IP地址 ♪IP地址的格式 特殊的 IP 地址&#xff1a; ♫端口号 ♪什么是端口号 ♪端口号的格式 ♪特殊的端口号 ♫网络协议 ♫五元组 ♫协议分层 ♫OSI七层模型 ♫TCP/I…