6.4翻转二叉树(LC226—送分题,前序遍历)

news2025/1/11 12:41:57

算法:

第一想法是用昨天的层序遍历,把每一层level用切片反转。但是这样时间复杂度很高。

其实只要在遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。

这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了

注意:是指针进行交换,交换的是左右孩子,然后里面的值再交换

首先使用递归法,代码简单:

调试过程:

原因:root没有迭代,一直都是有值的根节点。有递归了,其实不用while循环了。

正确代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        #root是每一个节点变量,不一定是根节点
        if root == None:
            return None
        else:
            #交换左右孩子指针(V)
            root.left, root.right = root.right, root.left
            #L,每个子树下面的节点进一步进行左右交换
            if root.left:
                root.left = self.invertTree(root.left)
            #R,每个子树下面的节点进一步进行左右交换
            if root.right:
                root.right = self.invertTree(root.right)
        return root

时间空间复杂度:

`invertTree`函数的时间复杂度是O(n),其中n是二叉树中的节点数。这是因为我们对每个节点进行一次访问,并且对每个节点执行固定量的工作。

`invertTree`函数的空间复杂度是O(h),其中h是二叉树的高度。这是因为函数使用递归,递归的最大深度等于树的高度。在最坏的情况下,即树完全不平衡且类似于链表的情况下,树的高度等于节点数,导致空间复杂度为O(n)。然而,在平衡的二叉树中,高度通常是log(n),导致空间复杂度为O(log(n))。

面试官看你顺畅的写出了递归,一般会进一步考察能不能写出相应的迭代

我觉得迭代法就是要加循环:

使用迭代的方式来翻转二叉树。我们从根节点开始,将根节点入栈。然后,进入循环,直到栈为空。在循环中,我们从栈中弹出一个节点,并交换其左右子节点的指针。如果存在左子节点,则将其入栈,如果存在右子节点,则将其入栈。

`stack`用于迭代地翻转二叉树。它起到了存储待处理节点的作用。

使用栈的迭代方法相比于递归方法,可以减少递归调用的开销,同时也可以避免递归的最大深度限制。

递归的最大深度限制是什么?

递归的最大深度限制是指递归调用的层数上限。每次进行递归调用时,系统会在内存中为该函数分配一段栈空间,用于保存函数的局部变量、参数和返回地址等信息。当递归的层数过多时,栈空间会被耗尽,导致栈溢出错误。

不同的编程语言和操作系统对递归的最大深度限制可能有所不同。在Python中,默认的最大递归深度是1000层,超过这个限制将引发"RecursionError"异常。可以使用`sys.setrecursionlimit()`函数来修改Python的递归深度限制,但是需要注意修改深度限制可能会导致栈溢出错误。

为了避免递归的最大深度限制,可以使用迭代的方法来替代递归,或者使用尾递归优化等技术来减少递归调用的层数。

正确代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        #root是根节点
        if root == None:
            return None
        else:
            stack = [root]
            #交换左右孩子指针(V)
            while stack:
                #将node定义为每个节点
                node = stack.pop()
                #交换
                node.left, node.right = node.right, node.left
                #L,将node.left存入stack,这样循环时pop出来,进行子节点的交换
                if node.left:
                    stack.append(node.left)                   
                #R,每个子树下面的节点进一步进行左右交换
                if node.right:
                    stack.append(node.right)  
        return root

时间空间复杂度:

时间复杂度:

  • 遍历每个节点并交换其左右子节点的指针需要O(n)的时间,其中n是二叉树中的节点数。

空间复杂度:

  • 使用了一个栈来存储待处理节点,最坏情况下,栈的大小与二叉树的高度成正比,即O(h),其中h是二叉树的高度。
  • 在最坏情况下,当二叉树是一个单链表时,树的高度等于节点数,因此空间复杂度为O(n)。
  • 在平衡的二叉树中,树的高度通常是log(n),因此空间复杂度为O(log(n))。

综上所述,该解决方案的时间复杂度为O(n),空间复杂度为O(h)或O(n)。

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

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

相关文章

赛氪中西部外语翻译大赛入榜2023国内翻译赛事发展评估报告

中西部外语翻译大赛入选中国外文局CATTI项目管理中心和中国外文界平台联合发布《2023国内翻译赛事发展评估报告》 近日,中国外文局CATTI项目管理中心和中国外文界平台联合发布了《2023国内翻译赛事发展评估报告》,报告对国内主流外语翻译赛事进行了问卷调…

Centos8安装出错问题

科普介绍: CentOS 8 是一个基于 Linux 的操作系统,是 Red Hat Enterprise Linux (RHEL)的免费和开源版本。它提供了稳定、安全和可靠的基础设施,适用于服务器和桌面环境。CentOS 8 是 CentOS 系列中最新的版本&#x…

Nginx(五)

负载均衡 官网文档 Using nginx as HTTP load balancer nginx中实现反向代理的方式 HTTP:通过nginx配置反向代理到后端服务器,nginx将接收到的HTTP请求转发给后端服务器。使用 proxy_pass 命令 HTTPS:通过nginx配置反向代理到后端服务器&…

Amazon Aurora MySQL 与 Amazon Redshift 的 Zero ETL 集成已全面可用,一起轻松上手!

“数据是应用、流程和商业决策的核心。” 亚马逊云科技数据库、 数据分析和机器学习全球副总裁 Swami Sivasubramanian 如今,客户常用的数据传输模式是建立从 Amazon Aurora 到 Amazon Redshift 的数据管道。这些解决方案能够帮助客户获得新的见解,进而…

【狂神说Java】linux详解

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :狂神说Java 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远…

Llama2通过llama.cpp模型量化 WindowsLinux本地部署

Llama2通过llama.cpp模型量化 Windows&Linux本地部署 什么是LLaMA 1 and 2 LLaMA,它是一组基础语言模型,参数范围从7B到65B。在数万亿的tokens上训练的模型,并表明可以专门使用公开可用的数据集来训练最先进的模型,而无需求…

编码规范集合

文章目录 前言命名规范项目命名目录命名文件命名命名严谨性 HTML 书写规范结构、样式、行为分离缩进文件编码语义化IE 兼容模式viewport为移动端设备优化,设置可见区域的宽度和初始缩放比例iOS 图标favicon(网站图标,移动端默认可用于添加到桌…

微信小程序前端开发

目录 前言: 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言: 当谈到微信小程序前端开发时,我们指的是使用微信小程序框架进行开发的一种方式。在本文中,我…

100+ Windows运行命令大全,装B高手必备

操作电脑关闭、重启、注销、休眠的命令细则: 用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f] [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]] 没有参数 显示帮助。这与键入 /? 是一样的。…

第七章 :Spring Boot web开发常用注解(二)

第七章 :Spring Boot web开发常用注解(二) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个章节,可以作为web开发工程师注解参考手册,SpringBoot常用注解大全,一目了然!。本…

python机器学习——随机森林

随机森林 随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理: 决策树(Decision Tree): 随机森林由多个决策树组成。决策树是一种基于树…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持,允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法,用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

JTS: 18 DistanceToPoint 最近距离计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.algorithm.distance.DistanceToPoint; import org.locationtech.jts.algorithm.distance.PointPairDistance; import org.locationtech.jts.geom.Coordin…

【Qt-23】ui界面设计-ToolBar

1、ToolBar 右击主窗体添加工具栏 新建动作,可设置图标,图标有本地文件和资源两种方式。 修改toolButtonStyle的属性,可设置图标与汉字显示的方式。 页面跳转: connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…

抖音直播矩阵玩法,直播矩阵引流项目,每日精准引流500左右

今天我再分享一个专注于纯直播带货的玩法,这个案例不论是导流还是直播模式,都值得我们深入关注。某音直播矩阵玩法,每日精准引流500 这种直播方式通常会邀请两位模特,一个展示产品,一个递交产品,无需过多的…

小程序开发——小程序页面的配置与生命周期

目录 1.小程序的页面配置 2.页面的生命周期 3.页面跳转 4.页面间的参数传递 5.新闻客户端案例讲解 6.小结 1.小程序的页面配置 页面的配置设置app.json中的window配置项的内容(页面中配置项会覆盖app.json的window中相同的配置项),其属…

【狂神说Java】SpringCloud-Netflix

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :狂神说Java 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远…

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二(推荐) 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术,用于理解卷积神经网络(CNN)中的卷积核是如何对…

Kali常用配置(持续更新)

1. 同步系统时间 命令:dpkg-reconfigure tzdata ,这个命令可以同时更新系统时间和硬件时间。 然后选择区域和城市,中国可以先选择Asia,然后选择Shanghai 2.更换系统数据源 # vim /etc/apt/sources.list #不是root用户的话需要…

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程: 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里: 字符过滤器 首先&a…