力扣刷题-二叉树-翻转二叉树

news2024/11/20 3:37:15

226.翻转二叉树

翻转一棵二叉树。
image.png

思路

参考:
https://www.programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%80%9D%E8%B7%AF
如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图:image.png
可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。
注意:交换孩子 其实交换的是指针
关键在于遍历顺序,前中后序应该选哪一种遍历顺序? (一些同学这道题都过了,但是不知道自己用的是什么顺序)
遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果
这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了
那么层序遍历可以不可以呢?依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!

代码

递归法(前序遍历)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return root
        root.left, root.right = root.right, root.left # 交换 因为是中左右 第一次先遇到中 所以先交换
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

写递归的三点:
递归函数的参数:本题只要是node(当前遍历的“中”节点,力扣上为root)
终止条件:遇到空节点
单层逻辑/处理逻辑:交换左右孩子

时间复杂度:O(N) 其中 N 为二叉树节点的数目。我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。
空间复杂度:O(N) 使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。在平均情况下,二叉树的高度与节点个数为对数关系,即 O(log⁡N)。而在最坏情况下,树形成链状,空间复杂度为 O(N)。

递归(后序遍历)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return root
        # root.left, root.right = root.right, root.left # 交换 因为是中左右 第一次先遇到中 所以先交换
        self.invertTree(root.left)
        self.invertTree(root.right)
        root.left, root.right = root.right, root.left # 交换 后序遍历 因为是左右中 最后先遇到中 所以最后交换
        return root

迭代(前序遍历)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return root
        stack = [root]
        while stack:
            node = stack.pop()
            node.left, node.right = node.right, node.left # 交换
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return root

迭代(后序遍历)

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return root
        stack = [root]
        while stack:
            node = stack.pop()
            # node.left, node.right = node.right, node.left
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
            node.left, node.right = node.right, node.left
        return root

层序遍历

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if not root:
            return root

        queue = deque([root])
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                node.left, node.right = node.right, node.left # 交换
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return root

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

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

相关文章

【CUDA编程--编程模型简介算子开发流程】

官方文档:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 什么是CUDA CUDA全称(Compute Unified Device Architecture)统一计算架构,是NVIDIA推出的并行计算平台深度学习加速:对于神经网络&…

超级干货:光纤知识总结最全的文章

你们好,我的网工朋友。 光纤已经是远距离有线信号传输的主要手段,而安装、维护光纤也是很多人网络布线的基本功。 在网络布线中,通常室外楼宇间幢与幢之间使用的是光缆,室内楼宇内部大都使用的是以太网双绞线,也有使用…

前端案例-css实现ul中对li进行换行

场景描述: 我想要实现,在展示的item个数少于4个的时候,则排成一行,并且均分(比如说有3个,则每个的宽度为33.3%),如果item 个数大于4,则进行换行。 效果如下&#xff1a…

冰点还原精灵_Deep Freeze Standard v8.60.020.5592中文版

eep Freeze(又被成为冰点还原精灵)是Faronics公司出品的一款简单易用的系统还原软件,使用能够帮助用户轻松将系统还原到安装该款软件之后状态,避免因为病毒的入侵以及人为的对系统无意或无意的破坏,让你的系统始终完美…

HTTP——

HTTP 请求报文的构成 如下图: 第一行:HTTP请求的方法,具体是POST方法还是GET方法,或是其它方法;URI就是你的HTTP请求的路径;后面是HTTP协议的版本; 第二行往下连续多行:这些是请求头部分,也就是请求的首部设置的一些信息,相当于对HTTP请求的一些设置; 空格行:在…

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…

VS Code设置技巧

基础设置 中文界面 安装扩展:Chinese(Simplified) Language Pack 自动换行 文件 - 首选项 - 设置,搜索wrap,找到Editor: Word Wrap,将其更改为on。

分享一个个人博客神器 VanBlog

一、先看效果图 这是前台页面,我已经发布了一篇文章 这是后台页面 一句话,真的好用,各种功能一应俱全,废话不多说,开始吧。 二、 安装docker容器技术 如果你没有安装 docker 和 docker-compose,可以通…

错误边界(Error boundary)

错误边界(Error boundary): 用来捕获后代组件错误,渲染出备用页面 只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误 getDerivedStateFromError配合componentDidCatch 案…

C++--二叉树经典例题

本文,我们主要讲解一些适合用C的数据结构来求解的二叉树问题,其中涉及了二叉树的遍历,栈和队列等数据结构,递归与回溯等知识,希望可以帮助你进一步理解二叉树。 目录​​​​​​​ 1.二叉树的层序遍历 2.二叉树的公…

【Redis】Zset有序集合

上一篇: Hash哈希类型 https://blog.csdn.net/m0_67930426/article/details/134382507?spm1001.2014.3001.5502 目录 Zadd Zrange Zcard Zcount Zrem set是一个无序且元素不可重复的集合 而Zset是一个有序的集合,集合里的每个元素都有一个评分(…

Linux网络——自定义协议

目录 一.什么是协议 二.协议与报文 三.自定义协议 1.封装套接字 2.构建请求与响应 3.序列化和反序列化 4.报头添加和去除 5.报文读取 四.服务器端程序 五.客户端程序 一.什么是协议 协议在生活中泛指:双方或多方为了完成某项任务或达成某种目的而制定的共…

文件操作(上)

目录 为什么使用文件什么是文件?程序文件数据文件文件名 二进制文件和文本文件文件的打开和关闭流和标准流流标准流 文件指针文件的打开和关闭 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 &…

DMDEM部署说明-详细步骤-(DM8达梦数据库)

DMDEM部署说明-详细步骤-DM8达梦数据库 环境介绍1 部署DM8 数据库1.1 创建一个数据库作为DEM后台数据库1.2 创建数据库用户 DEM1.3 使用DEM用户导入dem_init.sql 2 配置tomcat2.1 配置/tomcat/conf/server.xml2.2 修改jvm启动参数 3 配置JAVA 1.8及以上版本的运行时环境3.1 配置…

数据分析 - 思考题

上班路上刷到的有趣题

基于教与学算法优化概率神经网络PNN的分类预测 - 附代码

基于教与学算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于教与学算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于教与学优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH(Authentication Header,认证头) ESP(Encapsulating Security Payload,封装安全载荷) IKE(Internet Key Exchange,因特网密钥…

eNSP启动路由器一直出#号、以为是安装配置winpcap的问题。。。。(以为是win10安装winpcap失败的问题。。。)

问题描述:eNSP启动一直出#号的一种参考方法_ensp一直#_Hong的博客-CSDN博客 原因是看了这篇博客,觉得ensp启动路由器的时候一直出现#号是因为winpcap安装的时候出现的问题。查看自己的winpcap安装成功之后的目录是: 然后因为那篇…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…