python数据结构递归树_python数据结构(对称二叉树递归和迭代)

1、题目描述

给定一个二叉树,检查它是否是镜像对称的。

2、代码详解

2.1 递归写法

# Definition for a binary tree node.

class TreeNode(object):

def __init__(self, x):

self.val = x

self.left = None

self.right = None

class Solution(object):

# 递归写法

def isSymmetric(self, root):

"""

:type root: TreeNode

:rtype: bool

"""

return self.isMirror(root, root)

def isMirror(self, root1, root2):

# 递归结束条件

if not root1 and not root2: # 条件1:都为空指针则返回 true

return True

elif not root1 or not root2: # 条件2:只有一个为空则返回 false

return False

return (root1.val == root2.val) and \

self.isMirror(root1.left, root2.right) and \

self.isMirror(root1.right, root2.left)

pNode1 = TreeNode(1)

pNode2 = TreeNode(2)

pNode3 = TreeNode(2)

pNode4 = TreeNode(3)

pNode5 = TreeNode(4)

pNode6 = TreeNode(4)

pNode7 = TreeNode(3)

pNode1.left = pNode2

pNode1.right = pNode3

pNode2.left = pNode4

pNode2.right = pNode5

pNode3.left = pNode6

pNode3.right = pNode7

S = Solution()

print(S.isSymmetric(pNode1)) # True

时间复杂度是 O(n),因为要遍历 n 个节点

空间复杂度是 O(n),是递归的深度,也就是跟树高度有关,最坏情况下树变成一个链表结构,高度是n。

2.2 迭代写法

用队列来实现

首先从队列中拿出两个节点(left 和 right)比较

将 left 的 left 节点和 right 的 right 节点放入队列

将 left 的 right 节点和 right 的 left 节点放入队列

时间复杂度是 O(n),空间复杂度是 O(n)

class Solution(object):

def isSymmetric(self, root):

"""

:type root: TreeNode

:rtype: bool

"""

if not root or not (root.left or root.right):

return True

# 用队列保存节点

queue = [root.left,root.right]

while queue:

# 从队列中取出两个节点,再比较这两个节点

left = queue.pop(0)

right = queue.pop(0)

# 如果两个节点都为空就继续循环,两者有一个为空就返回false

if not (left or right):

continue

if not (left and right):

return False

if left.val!=right.val:

return False

# 将左节点的左孩子, 右节点的右孩子放入队列

queue.append(left.left)

queue.append(right.right)

# 将左节点的右孩子,右节点的左孩子放入队列

queue.append(left.right)

queue.append(right.left)

return True

本文地址:https://blog.csdn.net/IOT_victor/article/details/107117445

希望与广大网友互动??

点此进行留言吧!

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

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

相关文章

python跨文件复制sheet_Python办公自动化-工作表复制(可跨文件)

我们平时在处理Excel文档,会涉及到工作表的复制。一般我们会遇到这两种工作表复制需求:单个Excel文档内将工作表复制多分多个Excel文档之间,相互复制工作表将多Excel文档中的工作表复制到同一个Excel文档中针对与上述需求,我们可以…

python 神经网络原理_神经网络理论基础及Python实现

一、多层前向神经网络多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入…

postman 使用_Postman使用方法

一 Postman背景介绍用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网页基…

bool python 运算_python基础知识和pycharm安装

昨天大家对我(Python)有了一定的了解,那么今天带大家更加系统化的认识一下我,已经了解我的工作方式先说一下如果让我去做一件事情得需要那些“配置”,其实很简单的,不要把我想的太复杂,毕竟还是个单纯的孩子。让我做事…

python send 案例_python之pexpect实现自动交互的例子

Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互&a…

视频显示边缘空白的真相

在多媒体开发过程中,难免会使用到video这一类型。但一直有部分开发者或产品人员总提出 “视频画面没有充满”其给定的窗口,其原因在于对视频不了解,想当然的去认为要“充满”。被问到此问题只能苦笑一声,哭笑不得。 先看下几个效果…

word公式编辑器_毕业论文里面的各种公式该如何编辑

毕业论文中很多专业都会需要书写很多公式,而对于对Word使用不够熟练的朋友肯定会在编辑公式上很苦恼了,Word自带的公式编辑器又不够方便,本节给大家介绍一种很方便的公式编辑方法,而且更改公式后公式序号会自动跟着变。安装好后打…

Gensee移动SDK之(一)结构组成

gensee 移动sdk现已更新到v3.3,自1.0到3.0的过度当中,经历了几次大的变革。每次变革都新的功能接口和结构上微妙的变化,但直播、点播的结构组成基本定型,即便是扩展也会依此延续。Sdk为了界面上的自由度,不提供完整的U…

python分析服务器日志_python实现web服务器日志分析脚本

python日志分析脚本用python可以实现大日志文件的分析,比如查到sql注入语句,然后看到IP,就可以改下脚本,用IP为特征取出日志,分析入侵过程。python比较shell脚本的优点是速度快,性能好,跑1G日志…

Gensee移动SDK之(二)协议

首先,对于协议而言,有标准的,也有私有的,就看具体使用场景的修饰与更改情况了。部分朋友在接触SDK的时候会提出此疑问,只能说“各怀鬼胎”。第一,即便我们告知我们使用的协议,该用sdk的时候&…

vs点击方法跳不到对于的地方_内脏脂肪怎么测?这个方法也太方便了!| EASD 2020...

我马上开始减肥还不行么?秋天——丰收的日子,看着肥美的鱼蟹,软糯的栗蓉,甜美的桂花糕,不认真贴秋膘都对不起这么丰盛的美食!等等,别想了,看看肚子上层层叠起的肥肉,量量…

Gensee Android SDK(一)组成结构

在分支平台Android上sdk,基本主线不会变,变的只是与平台相关的部分,例如视频采集、音频采集、权限等。 按功能分类分为 RtSDK 重点是可以支持视频互动、发(控制)直播的能力。接口功能上基本上等同于PC客户端。 可以做…

python中msg是什么意思_python下载.msg文件的附件

def get_attachments(file_name, path_name):"""获取.msg文件内的附件:param file_name: .msg文件路径:param path_name: 附件存放目录:return: None"""outlook win32com.client.Dispatch("Outlook.Application").GetNamespace("…

云服务器Ubuntu系统安装apache2发生“E: Unable to locate package”

Ubuntu安装apache2发生“E: Unable to locate package”云服务器安装apache2 出错E: Unable to locate package安装apache2测试apache2安装云服务器安装apache2 出错E: Unable to locate package 最近买了个云主机,操作系统由centos换成Ubuntu的之后,先…

python 构造函数继承_Python多重继承的异构构造器

在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成误解和疑惑。一般“常识”说,使用super访问…

Android OpenGL Cannot create GL program: 0 GL error: 1282

Android OpenGL create GL program: 0 & GL error: 1282 快速解决 1. 使用GLSurfaceView的话 请在继承类中合适的地方(一般是构造函数里面)设置当前的clientversion 为 2 具体代码: setEGLContextClientVersion(2);2. 使用自己构建的opengl环境的话 请在创…

pythoncsv格式列变换_用Python将csv行转换为列

关于如何使用zip合并数据以及转置列表的一些提示。这听起来像是如何转置csv是你真正的问题。如何转置csv的答案是将其放入列表列表(例如通过csv模块),然后将其转置并写回文件(如果需要)。在row1 [1,2,3]row2 [a, b, c]list(zip(row1, row2))Out[45]: [(1, a), (2,…

Android DDMS的打开以及查看手机页面布局层次

ddms 查看android的界面布局层次 有时候看到一个比较好的界面或体验好的界面,就忍不住想看看其实现结果,那么可以通过DDMS工具来看相连设备层次以及使用哪些view。 上图是查看微信布局展现。说明,这里查看的就是显示在当前屏幕上的界面&am…

python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行

我有一个程序,在你点击一个操作按钮后运行一个很长的过程。当进程运行时,根窗口会说它没有响应,即使我知道程序是在后台运行的。这个程序将发布给我的几个同事,我想确保他们看到这个时不会惊慌失措,关上窗户。我的解决…

mac os11以下安装Xcode

前段时间mac重装系统,所有软件都清除了,下载从商店里面安装Xcode 12.5.1版本,直接提示“要求mac os 11.0或更高版本,于是乎开始升级mac os,检查更新并更新之后,最新版本就是macOS Catalina10.15.7&#xff…