python-leetcode 38.翻转二叉树

题目:

给定一个二叉树的根节点root,检查它是否轴对称。


方法一:递归

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。

互为镜像的条件:他们的两个根结点具有相同的值,每棵树的右子树都与另一个树的左子树镜像对称

可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移,p左移时,q右移。每次检查当前p和q节点的值是否相等,如果相等再判断左右子树是否对称。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: bool
        """
        return self.check(root.left,root.right)
    def check(self,p,q):
        if p is None and q is None:
            return True 
        if p is None or q is None:
            return False
        return p.val==q.val and self.check(p.left,q.right) and self.check(p.right,q.left)

时间复杂度:O(n)

空间复杂度:O(n)


方法二:迭代

初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: bool
        """
        return self.check(root,root) #同一个根节点是因为要比较树的左右子树
    def check(self,u,v):
        q=[]  #将节点 u 和 v(即左右子树的根节点)添加到队列中,接下来我们将对这些节点进行比较
        q.append(u)
        q.append(v)
        while q:
            u=q.pop(0)
            v=q.pop(0)#每次从队列中取出两个节点比较,看它们是否对称
            if u is None and v is None:#如果都是 None,说明这两个子树都为空,可以跳过这次比较
                continue
            if u is None or v is None or u.val !=v.val:
                return False
            q.append(u.left) #节点 u 和 v 的子节点按照对称的方式加入队列
            q.append(v.right)
            q.append(u.right)
            q.append(v.left)
        return True

时间复杂度:O(n)

空间复杂度:O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

锐浪报表 Grid++Report 通用软件,通用模板个性打印

为提高软件打印报表的适应性,再软件中,使用统一的模板,实现个性化的调整。实现不同用的需求,本人作了以下尝试: 一、表头的选择 二、明细表格的高度的调整 // 明细表标题行高GridppReport_7.DetailGrid.ColumnTitle.H…

Plant Simulation培训教程-AGV配送物流仿真模块

原创 知行 天理智能科技 2024年12月31日 07:00 浙江 又到年终盘点的时候了,在这里我把之前录制的Plant Simulation培训教程-AGV配送物流仿真模块分享出来,有需要的可以直接联系我。 模型路径通过Marker点搭建,适用于磁条导航、二维码导航等…

【Python 专题】数据结构 树

LeetCode 题目104. 二叉树的最大深度(gif 图解)方法一:后序遍历(DFS)方法二:层序遍历(BFS)872. 叶子相似的树(DFS 遍历)1448. 统计二叉树中好节点的数目(DFS 遍历)437. 路径总和 III(前缀和 + DFS 回溯)1372. 二叉树中的最长交错路径(DFS)236. 二叉树的最近公共…

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

关于协同显著性物体检测的思考

摘要 问题一:什么叫做CoEG-Net框架? CoEG-Net 是一种用于图像分割或其他计算机视觉任务的深度学习框架,具体来说,它主要关注边缘感知和图像细节恢复。CoEG-Net 的全称是 Contextual Edge Guidance Network,其主要创新…

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …

【AI应用】Cherry Studio结合deepseek搭建本地知识库

硅基流动注册 前往 硅基官网 &#xff08;https://cloud.siliconflow.cn/i/JUwuNCzb&#xff09;链接带了我的推荐码&#xff0c;注册成功后&#xff0c;您将获得 14R&#xff08;2000W Token&#xff09;&#xff0c;用于配置 Embedding&#xff08;嵌入式模型&#xff09; 新…

第1章大型互联网公司的基础架构——1.11 消息中间件技术

消息队列&#xff08;Message Queue&#xff09;是分布式系统中最重要的中间件之一&#xff0c;在服务架构设计中被广泛使用。 1.11.1 通信模式与用途 消息中间件构建了这样的通信模式&#xff1a; 一条消息由生产者创建&#xff0c;并被投递到存放消息的队列中&#xff1b;…

windows解压多个文件夹内的zip文件脚本

情景引入 不知道大家是否有一个疑问&#xff0c;如果下载到的源码文件是很多个目录&#xff0c;目录里面的项目都是压缩的&#xff0c;那我们该怎么办&#xff1f; 目录结构 目录结构如下 Test ├── 1 │ └── 1.zip └── 2 └── 2.zip 执行脚本 先cd到Test下&am…

文件和目录的操作-8

文章目录 1.IO流2.文件流操作with语句3.文件和文件夹的操作4.案例1.IO流 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从源(source)到接收目标的(sink)有序数据。如果把输入/输出源比作“水桶”,那流就是“管道” 文件流:就是源或者…

EasyRTC:轻量化SDK赋能嵌入式设备,开启智能硬件音视频通讯新篇章

在智能硬件与物联网飞速发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈发重要。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架构…

处理哈希冲突

有时候哈希表⽆论选择什么哈希函数都⽆法避免冲突&#xff0c;那么插⼊数据时&#xff0c;如何解决冲突呢&#xff1f;主要两种⽅法&#xff0c;线性探测法和链地址法&#xff0c;这篇先做原理描述&#xff0c;下篇实现代码模拟 一、线性探测 发生冲突的位置开始&#xff0c;依…

安装MySQL9.1.0-winx64.msi的报错解决办法:Database initialization failed。(也适用9.2.0)

csdn上有很多关于安装MySQL9.1.0-winx64.msi的报错&#xff08;Database initialization failed&#xff09;的解决办法&#xff0c;根据报错log便签内容总结一下有以下几种&#xff1a; 1、电脑名称有中文的&#xff0c;参考这篇&#xff1a; 【MySQL】Windows上安装MySQL时…

聊一聊vue如何实现角色权限的控制的

大家好&#xff0c;我是G探险者。 关于角色与权限控制&#xff0c;通常是分为两大类&#xff1a;一种是菜单权限&#xff1b;一种是操作权限。 菜单权限是指&#xff0c;每个角色对应着可以看到哪些菜单&#xff0c;至于每个菜单里面的每个按钮&#xff0c;比如增删改查等等这类…

使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人

作者&#xff1a;来自 Elastic Bahubali Shetti 如何使用 Elastic 观察基于 OpenAI RAG 的应用程序。使用 Langtrace 对应用程序进行检测&#xff0c;收集日志、跟踪、指标&#xff0c;并了解 LLM 在 Kubernetes 上使用 OpenTelemetry 的 Elastic Distributions 的运行情况。 目…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者&#xff0c;在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践&#xff0c;帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

VSCode配置C/C++开发环境|最新教程202502

&#x1f4e2; ‌Windows版VSCode配置C/C开发环境&#xff08;单文件多文件全解析&#xff09;‌ 一、 ‌环境准备‌ ✅‌必需工具‌&#xff1a;Visual Studio Code 2025‌ ✅扩展插件‌&#xff1a;C/C&#xff08;Microsoft官方扩展&#xff09;&#x1f4e2; 这个必须安…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统&#xff0c;不需要降级 v1.0.91 &#xff08;2025&#xff09; 本文内容需要你有一定的 Linux 操作基础&#xff0c;最好是程序员那种&#xff0c;英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 文章导读 阿华将发布项目复盘系列的文章&#xff0c;旨在&#xff1a; 1&#xff1a;手把手细致带大家从0到…