力扣刷题-二叉树-对称二叉树
101 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false
思路
我的思路-中序遍历
利用中序遍历(左中右),遍历树,然后根据遍历结果根节点两边 左右 是否是相反的,如果是那么就是对称的。

比如这个,遍历结果为 3 2 4 1 4 2 3 ,在根节点两边,324和423是相反的,说明是对称的**——>错误!!!**
# 可以用中序遍历
class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""if not root:return Falseresult = []stack = []cur = rootwhile cur or stack:if cur:stack.append(cur)cur = cur.leftelse:cur = stack.pop()result.append(cur.val)cur = cur.rightindex = int(len(result)//2)return result[:index] == result[index+1:][::-1]

特殊情况下不能通过:

在这个例子下不能通过。
就是根节点左右两边一模一样,但是却有可能不是对称二叉树。
正确思路
首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
那么如何比较呢?
比较的是两个子树的里侧和外侧的元素是否相等。如图所示:

递归法
递归三部曲
- 确定递归函数的参数和返回值
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。
返回值自然是bool类型。
- 确定终止条件
要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)
左节点为空,右节点不为空,不对称,return false
左不为空,右为空,不对称 return false
左右都为空,对称,返回true
此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:
左右都不为空,比较节点数值,不相同就return false
此时左右节点不为空,且数值也不相同的情况我们也处理了。
- 确定单层递归的逻辑
此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
如果左右都对称就返回true ,有一侧不对称就返回false 。
# 递归法
class Solution(object):def isSymmetric(self, root):if not root:return True # 树为空也是返回Truereturn self.compare(root.left, root.right)def compare(self, left, right): # 递归第一点: 参数应该传入什么 返回类型为布尔# 递归第二点: 什么时候终止 一个有空 / 值不同# 排除节点为空的情况if left and not right: # 1. 有空情况:左不为空 右为空return Falseelif not left and right: # 2. 有空情况:左为空 右不为空return Falseelif not left and not right: # 3. 有空情况:都为空 Truereturn Trueelif left.val != right.val: # 3. 无空情况:值不相同return False# 递归第三点:单层逻辑# 此时就是:左右节点都不为空,且数值相同的情况# 此时才做递归,做下一层的判断outside = self.compare(left.left, right.right) # 外侧inside = self.compare(left.right, right.left) # 内侧return outside and inside # 比较内外侧是否相同
迭代法-使用队列
队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素。
核心思想就是:比较左右子树里侧和外侧是否相等
# 迭代法
from collections import deque
class Solution(object):def isSymmetric(self, root):if not root:return Truequeue = deque([root.left, root.right])while queue:left = queue.popleft()right = queue.popleft()# if (not left and right) or (left and not right) or (left.val != right.val):# return False 错误写法if not left and not right:continue # 左右都为空 继续if not left or not right or left.val != right.val: # 返回False的情况return Falsequeue.append(left.left) # 左节点左孩子queue.append(right.right) # 右节点右孩子queue.append(left.right) # 左节点右孩子queue.append(right.left) # 右节点左孩子return True
迭代法-使用栈
# 迭代法
class Solution(object):def isSymmetric(self, root):if not root:return True# queue = deque([root.left, root.right])stack = []stack.append(root.left)stack.append(root.right)while stack:left = stack.pop()right = stack.pop()# if (not left and right) or (left and not right) or (left.val != right.val):# return False 错误写法if not left and not right:continue # 左右都为空 继续if not left or not right or left.val != right.val: # 返回False的情况return Falsestack.append(left.left) # 左节点左孩子stack.append(right.right) # 右节点右孩子stack.append(left.right) # 左节点右孩子stack.append(right.left) # 右节点左孩子return True
100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:

输入:p = [1,2,3], q = [1,2,3] 输出:true
直接使用递归 主函数传入的不一样罢了 上一题是根节点左右节点 这一题是两棵树(用根节点表示)
递归
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 递归
class Solution(object):def isSameTree(self, p, q):""":type p: TreeNode:type q: TreeNode:rtype: bool"""return self.compare(p, q) # 直接调用即可 compare 包含了其中逻辑def compare(self, left, right): # 也是比较左右子树是否相同 同样从里侧和外侧 考虑if not left and right:return Falseelif left and not right:return Falseelif not left and not right:return Trueelif left.val != right.val:return Falseoutside = self.compare(left.left, right.left)inside = self.compare(left.right, right.right)return outside and inside
572. 另一棵树的子树
双递归 有难度
核心 找到一个节点相同了 把这个视为root再一次的根节点 从这个开始找 调用 compare
compare目的就是找到root起始节点与subRoot一致的时候 开始比较两棵树
而主函数是为了找到这样的一个root起始节点
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def isSubtree(self, root, subRoot):""":type root: TreeNode:type subRoot: TreeNode:rtype: bool"""if not root and not subRoot:return Trueif not root or not subRoot:return Falseif root.val == subRoot.val:if self.compare(root, subRoot):return Truereturn self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot) # 看root树的左右子树是否有subRootdef compare(self, p , q): # p q 代表两棵树 参数# 终止条件if not p and not q:return Trueif not p or not q:return Falseif p.val != q.val:return Falsereturn self.compare(p.left, q.left) and self.compare(p.right, q.right)
相关文章:
力扣刷题-二叉树-对称二叉树
101 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 思路 我的思路…...
常见面试题-计算机网络相关
1.OSI 七层模型? OSI 七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP 五层模型:应用层、传输层、网络层、链路层、物理层 应用层 应用层是由网络应用程序使用的,是离用户最近的一层 应用层通过…...
leetcode做题笔记231. 2 的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出:tr…...
AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大
目录 1 2 3 “AI人”并不算是新鲜事,随着AI的发展,AI主播也开始悄悄进入到直播间中。 持续无间断的直播、比人工费便宜等优势,让很多商家选择了AI主播。 AI主播到底好不好用?终于在今年“双11”现出了原形。 1 AI主播没火过半年…...
◢Django 自写分页与使用
目录 1、设置分页样式,并展示到浏览器 2、模拟页码 3、生成分页 4、数据显示 5、上一页下一页 6、数据库的数据分页 7、封装分页 8、使用封装好的分页 建立好app后,设置路径path(in2/,views.in2),视图def in2(request): ,HTML: in2.html…...
某城高速综合管控大数据大屏可视化【可视化项目案例-04】
🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…...
如何在Linux下进行文件查看
cat 文本内容显示到终端 head 查看文件开头 tail 查看文件结尾 常用参数 -f 文件内容更新后,显示信息同步更新 wc 统计文件内容信息...
OSG练习:模仿Ventsim制作三维矿井智能通风系统
1、效果 2、计划内容 1) 三维场景的加载显示;已实现 2)矿井巷道建模及纹理;已实现 3)矿井基础数据采集及修正;已实现 4)通风网络解算算法;已实现 5)通风设备及设施模型制作;未实现 6)风流模拟效果 ;进行中 7)火灾模拟效果;未实现 8)巷道属性查看栏;未实现 9)…...
【数据结构】非递归实现二叉树的前 + 中 + 后 + 层序遍历(听说面试会考?)
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…...
32 Feign性能优化
2.3.Feign使用优化 Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括: •URLConnection:默认实现,不支持连接池 •Apache HttpClient :支持连接池 •OKHttp:支持连接池 因此提高Feign的…...
星岛专栏|从Web3发展看金融与科技的融合之道
11月起,欧科云链与香港主流媒体星岛集团开设Web3.0安全技术专栏,该专栏主要面向香港从业者、交易机构、监管机构输出专业性的安全合规建议,旨在促进香港Web3.0行业向安全与合规发展。 出品|欧科云链研究院 自2016年首届香港金融…...
什么是网络爬虫?
网络爬虫是一种自动化程序,可以自动地浏览网站并从网站上抽取数据。APP数据抓取实际上也是运用了网络爬虫的技术,只不过抓取的对象不是网站上的信息,而是手机APP上的数据。下面详细介绍APP数据抓取的过程。 1、确定数据需求 首先需要明确要抓…...
酷柚易汛ERP - 商品库存余额表操作指南
1、应用场景 商品库存余额表用于查询商品在各仓库的实际结存量、单位成本以及成本等明细。 2、主要操作 打开【仓库】-【商品库存余额表】,可筛选仓库、商品、商品类别,导出/打印等操作见【销货单】不再赘述。 3、分享操作 库存余额分享,…...
第27期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...
大数据-玩转数据-Flume
一、Flume简介 Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Unix环境下运行。Flume基于流式架构,容错性强,也很灵活简单。Flume、Kafka用来实时进行数据收集,Spark、Flink用来实时处理数据,impala用来实时查询。二、Flume…...
【Linux】进程概念IV 进程地址空间
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 本篇导航 0. 数据在内存中的分布1. 虚拟地址与真实物理地址2. 进程地址空间2.1 进程地址空间概念2.2 进程->页表->内存 0. 数据在内…...
Flink在汽车行业的应用【面试加分系列】
很多同学问我为什么要发这些大数据前沿汇报? 一方面是自己学习完后觉得非常好,然后总结发出来方便大家阅读;另外一方面,看这些汇报对你的面试帮助会很大,特别是面试前可以看看即将面试公司在大数据前沿的发展动向&…...
智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造
智慧工地围绕建设过程管理,建设项目与智能生产、科学管理建设项目信息生态系统集成在一起,该数据在虚拟现实环境中,将物联网收集的工程信息用于数据挖掘和分析,提供过程趋势预测和专家计划,实现工程建设的智能化管理&a…...
Spring Boot(二)
1、运行维护 1.1、打包程序 SpringBoot程序是基于Maven创建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea环境下执行。 mvn package 打包后会产生一个与工程名类似的jar文件,其名称是由模块名版本号.jar组成的。 1.2、程序…...
上海亚商投顾:沪指缩量调整跌 高位强势股继续退潮
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数11月10日弱势震荡,上证50盘中跌超1%,以保险为首的权重板块走势较弱。 高位强…...
戴森球计划工厂蓝图库:从零开始的效率倍增实战指南
戴森球计划工厂蓝图库:从零开始的效率倍增实战指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 在戴森球计划的浩瀚宇宙中,高效的工厂布局是实现…...
华为防火墙IPsec点对点配置实战:从零到通的完整流程(附常见错误排查)
华为防火墙IPsec点对点配置实战:从零到通的完整流程(附常见错误排查) 在当今企业网络架构中,跨地域分支机构之间的安全通信已成为刚需。IPsec VPN凭借其强大的加密能力和标准化协议支持,成为构建安全通道的首选方案。华…...
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...
DecompilerMC:揭秘Minecraft源码反编译的高效方案
DecompilerMC:揭秘Minecraft源码反编译的高效方案 【免费下载链接】DecompilerMC This repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script or the …...
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取 语音识别技术正在快速融入我们的日常生活,从智能助手到实时字幕,都离不开高效的语音转文本能力。Qwen3-ASR-0.6B作为一款轻量级语音识别模型,在保证识别准确率的同时,更…...
ChatGLM-6B惊艳案例:高考作文命题分析、范文生成与评分建议
ChatGLM-6B惊艳案例:高考作文命题分析、范文生成与评分建议 ChatGLM-6B智能对话服务:本镜像为CSDN镜像构建作品,集成了清华大学KEG实验室与智谱AI共同训练的开源双语对话模型ChatGLM-6B,提供开箱即用的智能对话体验。 1. 高考作文…...
Z-Image-GGUF文生图模型问题解决:常见报错处理,让AI绘画更顺畅
Z-Image-GGUF文生图模型问题解决:常见报错处理,让AI绘画更顺畅 1. 引言 在使用Z-Image-GGUF文生图模型进行AI绘画创作时,许多用户可能会遇到各种技术问题和报错信息。本文将全面梳理最常见的报错情况及其解决方案,帮助您快速定位…...
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例 1. 项目概述 StructBERT中文文本相似度模型是一个基于百度深度学习技术的高精度语义理解工具,专门用于计算中文句子之间的语义相似度。这个模型能够理解中文语言的深层语义&…...
通义千问1.5-1.8B-Chat-GPTQ-Int4入门:C语言基础概念问答助手
通义千问1.5-1.8B-Chat-GPTQ-Int4入门:C语言基础概念问答助手 刚学C语言那会儿,指针、结构体这些概念真是让人头大。书上讲得抽象,网上资料又太零散,要是当时有个能随时提问、还能给出代码例子的“随身老师”就好了。现在&#x…...
从经典控制器到前沿控制的发展
目录 前言 一、PID控制 1.数字PID 2.PID参数的优化 1.微分项的问题 2.积分项的问题 3.PID参数整定法 3.PID参数对系统性能指标的影响 二、模糊控制 1.模糊控制的五大核心步骤 1.模糊化 2.建立模糊规控制规则 3.模糊推理与解模糊 2.模糊PID 1.直接型模糊PID 2.增…...
