python两种办法对二叉树判断是否对称

对于给定的一颗二叉树,需要判断其是否是对称二叉树,可以使用两种办法来对这个进行实现,分别使用深度优先搜索算法和广度优先搜索算法都可以完成。

首先考虑一下二叉树的对称,什么样的二叉树是对称二叉树,就是如果对所有给定的二叉树的所有节点中,镜像对称的位置上的节点是相同的节点,那就说明这棵树一定是对称的。

对广度优先搜索算法来进行解决的话,就是如何对比对称位置上的两个节点,借助于队列来令需要被比较的两个节点相邻,然后每次从队列中出队,相邻的两个节点直接进行比对,如果是相同的则继续比对,如果发现了不同的相邻节点,那则直接返回,说明该二叉树不是对称二叉树。

添加图片注释,不超过 140 字(可选)

该树便不是一颗对称的二叉树。

使用这颗二叉树作为例子,如果说对于两个节点9,左边节点的9和左子节点和右边节点9的右子节点相同,且左边节点9的右子节点与右边节点9的左子节点是相同的,所以在每一次的访问队列中节点的时候,就会取出的都是两个对称位置上的节点,将这两个节点的做优子节点按照一定的顺序入队,然后就会得到左节点的左子节点与右节点的右子节点相邻,左节点的额右子节点与右节点的左子结点相邻。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

使用python实现的广度优先搜索算法的方式如下:

def symmetric(root):
    if not root: return True
    queue=[]
    queue.append(root.left)
    queue.append(root.right)
    while(queue):
        root1=queue.pop()
        root2=queue.pop()
        if not root1 and not root2:
            continue
        if not root1 or not root2:
            return False
        if root1.val!=root2.val:
            return False
        if root1.left or root2.left or root1.right or root2.right:
            queue.append(root1.left)
            queue.append(root2.right)
            queue.append(root1.right)
            queue.append(root2.left)
    return True

而对于深度优先搜索算法,其递归性很强,如果判断一颗二叉树是否对称,其所有对应位置的两颗子树也是对称的,对于如上的二叉树的两颗左右子树,节点10为根节点的二叉树的左右子树一样,这棵树就是对称的,所以这里想要使用深度优先搜索算法来进行实现,其递归过程中主要是判断以两个节点为根节点的两棵树是否对称。

添加图片注释,不超过 140 字(可选)

如果这两颗子树对称,首先是两棵树的根节点是一定相同的,其次就是树A的左子树和树B的右子树、树A的右子树和树B的左子树必须是对称的,满足这些条件的话就可以判断树对称,实现过程中,对于定义的主调函数和递归函数,主调函数中如果根节点不为空节点,则将递归函数传入初始的两个子节点,递归函数的作用主要是用于判断传入的两个左右节点为根节点的子树是否对称,对称即返回给定二叉树是对称二叉树,否则则返回该二叉树不对称。深度优先搜索算法实现的代码如下:

def symmetric(root):
    if root:
        return dfs(root.left,root.right)
    return True
def dfs(root1,root2):
    if not root1 and not root2:
        return True
    if not root1 or not root2:
        return False
    return root1.val==root2.val and dfs(root1.left,root2.right) and dfs(root1.right,root2.left)

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

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

相关文章

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求: 一,TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名,多以它总应该弹出一个文件选择对话框,这也…

2024年CES展会都有些啥?亮点集锦都在这里

💡 大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、读书和自媒体。 CES在科技界是一场盛会,被誉为科技界的春晚,展会上前沿的技术、概念的产品吸引不少关注。2024年CES是在2023年大语言模型…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足,则执行代码块 //代码块 } 案例 从控制台输入一个整数,如果该数字小于 10 ,则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

如何实现网页当前页面刷新功能

类似于这样的页面 实现思路如下: 首先我们在pinia中定义一个刷新状态的字段,点击按钮的时候,改为相反的值对主页面的路由跳转Router-view绑定一个v-if,它绑定一个自定义的一个响应的参数,我们在主页面监听pinia的刷新状态数据&am…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲(简称“拉美”)绝大多数消费者来说还是一个新鲜技术。GSMA报告显示,过去五年,拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中,紧跟全球5G发展大潮&#…

软件测试|Beautiful Soup库详细使用指南

简介 Beautiful Soup是一款强大的Python库,广泛用于解析HTML和XML文档,从中提取数据并进行处理。它的灵活性和易用性使得数据抽取变得简单,本文将详细介绍Beautiful Soup库的基本用法和示例。 安装Beautiful Soup 首先,需要确保…

软件测试工程师如何对算法做测试?

最近几年,随着大数据、人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。 为了让大家能对算法测试有个初步的了解,这篇文章将对“如何做算法测试”进行梳理,大纲如下: 1、算法测试测…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…

Python3.5如何打包编译

python3.5怎么打包编译 问题:用Python开发的小工具有时需要编译打包为Windows(*.exe)、Mac等操作系统下的可执行性文件以供非程序员使用。 解决方案: 一、py2exe 目前只支持到Python3.4,暂不支持Python3.5 二、PyInstaller 安装&#x…

【MATLAB】小波_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波-LSTM神经网络时序预测算法是一种结合了小波变换和长短期记忆神经网络(LSTM)的时间序列预测方法。 小波变换是一种信号处理方法,能够将信号分解为…

2024年1月6日~2024年1月12日周报

目录 一、前言 二、SeisInvNet-2020 三、RTM研究 四、遇到的问题及解决 4.1 KeyError: data 4.2 将mat文件转换为npy文件 五、小结 5.1 存在的问题及疑惑 5.2 下周安排 一、前言 本周的主要安排是阅读论文查看一些好的点子。 但是想法总是美好的,之前答应的…

叠加文件夹内所有png文件 python

→ import os import cv2 import matplotlib.pyplot as pltPATH "./1" #文件路径 i 0 #子文件夹路径 img10 for parent, dirs, files in os.walk(PATH):for file in files:if not file.endswith(.png):continueimg cv2.imread(os.path.join(parent, file))if i0:i…

【Linux驱动】platform 设备驱动分离(一)—— 驱动分层及相关API

以目前为止的逻辑,无论是获取设备属性信息,还是实现驱动逻辑,都是放在一个驱动模块中。在没有设备树的情况下,如果我们只需要修改设备信息(如寄存器地址),那么我们就需要重新编译整个驱动模块。…

80V 72V 60V 48V 降12V 5V 3.3V 功耗低降压恒压芯片H6603

输入电压80V、72V、60V、48V:这些是电源系统中的不同电压水平,通常用于驱动各种设备。例如,电动汽车、电动自行车或工业设备中的电池系统可能以这些电压级别工作。 降12V:这可能是指一种电源模块,其功能是将输入电压&…

x-cmd pkg | dua - 磁盘使用分析器

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 dua 是 Disk Usage Analyzer 的简写,该工具可以快速查看给定目录的磁盘空间使用情况。 对于想要深入了解磁盘空间使用情况并有效管理存储的用户来说,Dua 是一个很有价值的工具。通过使用 Dua …

自己动手造一个状态机

自己动手造一个状态机 引言有限自动状态机 (FSM)五要素应用场景优势 开源产品造个轮子改造点Looplab fsm示例演示实现解析 改造过程 引言 有限自动状态机 (Finite-state machine , FSM) 通常用来描述某个具有有限个状态的对象,并且在对象的生命周期中组成了一个状态…

Android 13 辅助屏导航栏不显示问题

问题 在Android 13 上开启辅助屏幕。但是发现辅助屏systemui 导航按 icon没有显示,但是点击对应的区域有作用 分析 可以用 anroid device monitor 工具分析视图 解决 public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);//add star…

x-cmd pkg | smartctl - 用于监测和分析硬盘的工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 smartctl 是一个用于监测和分析硬盘中 S.M.A.R.T.(自我检测,分析和报告技术)信息的命令行工具,是 Smartmontools 的一部分。通过 smartctl 工具,可以分析各种…

安泰电子前置微小信号放大器怎么用的

前置微小信号放大器是一种重要的电子设备,用于放大微弱的输入信号,提高系统的灵敏度。它在各种领域中都有广泛的应用,包括音频、通信、测量等。在这篇文章中,我们将详细介绍前置微小信号放大器的使用方法,以便更好地理…

Cdd诊断数据控中的zz rc yy

如上图所示的Cdd Candela Diagnostic Descriptions 诊断数据库会话定义中有许多的标识符缩写,如zz rc LL xx 等 其实这些字母没有意义,它们只是唯一地标识对话框中的组合组件。