LeetCode刷题之旅(中等 -5):101. 对称二叉树

LeetCode101对称二叉树 算法特点及适用场景特点利用递归的思想巧妙地将判断二叉树是否对称的问题转化为比较对应子树是否对称相等的子问题,代码结构清晰简洁,逻辑上很符合二叉树这种具有递归结构的数据结构特点,易于理解和实现。通过层层递归比较节点值以及子树的对称性,能够准确地判断二叉树是否满足对称的性质。时间复杂度为 $O (n)`,在遍历二叉树节点判断对称性方面具有合理的效率表现,只要二叉树的节点数量在可接受范围内,都能较快地得出二叉树是否对称的结论。适用场景。 阅读详情

2019年9月20日

小白我接触到这里题目时,一开始是有点懵逼的,虽然说有点基础,但是门槛就在那,所以还是花了点时间去消化递归与树的结合,直到自己最后恍然大悟,原来如此。。。

目录

题目:

解决方法1:递归遍历左右字数的对称节点

性能结果:

官方解决思路:

复杂度分析

解决方法2:

性能结果:

复杂度分析:

其他:


题目:

 

解决方法1:递归遍历左右字数的对称节点

package leetCode.tree;

/**
 * 对称二叉树
 * @author moubin.mo
 * @date: 2019/9/18 21:40
 */

public class SymmetricTreeSolution {

	public static void main(String[] args){
		TreeNode aTree = getATree();
		System.out.println("result = " + isSymmetric(aTree));
	}

	public static boolean isSymmetric(TreeNode root){

		if (root == null){
			return true;
		}

		if(root.left == null && root.right == null){
			return true;
		}

		if (root.left != null && root.right != null){
			return isSymmetric(root.left, root.right) && isSymmetric(root.right, root.left);
		}

		return false;
	}

	public static boolean isSymmetric(TreeNode node1, TreeNode node2){
		if (node1 == null && node2 == null){
			return true;
		}

		if (node1 == null || node2 == null){
			return false;
		}

		if (node1.val == node2.val){
			return isSymmetric(node1.left, node2.right) && isSymmetric(node1.right, node2.left);
		}

		return false;
	}

	/**
	 * 创建一棵树
	 */
	public static TreeNode getATree(){
		TreeNode headNode = new TreeNode(1);

		// 第一场节点
		TreeNode leftNode = new TreeNode(2);
		TreeNode rightNode = new TreeNode(2);

		// 第二层节点
		TreeNode leftChild1Node = new TreeNode(3);
		TreeNode leftChild2Node = new TreeNode(4);
		TreeNode rightChild1Node = new TreeNode(3);
		TreeNode rightChild2Node = new TreeNode(4);

//		leftNode.left = leftChild1Node;
//		leftNode.right = leftChild2Node;
//		rightNode.left = rightChild2Node;
//		rightNode.right = rightChild1Node;

		headNode.setLeft(leftNode);
		headNode.setRight(rightNode);
		return headNode;
	}

}

性能结果:

官方解决思路:

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

因此,该问题可以转化为:两个树在什么情况下互为镜像?

如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值。
  • 每个树的右子树都与另一个树的左子树镜像对称。


就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。

复杂度分析

  • 时间复杂度:O(n)O(n),因为我们遍历整个输入树一次,所以总的运行时间为 O(n)O(n),其中 nn 是树中结点的总数。
  • 空间复杂度:递归调用的次数受树的高度限制。在最糟糕情况下,树是线性的,其高度为 O(n)O(n)。因此,在最糟糕的情况下,由栈上的递归调用造成的空间复杂度为 O(n)O(n)。


官方解决方法2:


/**
 * 对称二叉树
 * @author moubin.mo
 * @date: 2019/9/18 21:40
 */

public class SymmetricTreeSolution {

	public static void main(String[] args){
		TreeNode aTree = getATree();
		System.out.println("result = " + isSymmetricVIteration(aTree));
	}

	/**
	 * 迭代-队列
	 */
	public static boolean isSymmetricVIteration(TreeNode root){
		Queue<TreeNode> queue = new LinkedList<>();
		queue.add(root);
		queue.add(root);
		while (!queue.isEmpty()){
			TreeNode t1 = queue.poll();
			TreeNode t2 = queue.poll();
			if (t1 == null && t2 == null){
				continue;
			}
			if (t1 == null || t2 == null){
				return false;
			}
			if (t1.val != t2.val){
				return false;
			}
			queue.add(t1.left);
			queue.add(t2.right);
			queue.add(t1.right);
			queue.add(t2.left);
		}
		return true;
	}

	/**
	 * 创建一棵树
	 */
	public static TreeNode getATree(){
		TreeNode headNode = new TreeNode(1);

		// 第一场节点
		TreeNode leftNode = new TreeNode(2);
		TreeNode rightNode = new TreeNode(3);

		// 第二层节点
		TreeNode leftChild1Node = new TreeNode(3);
		TreeNode leftChild2Node = new TreeNode(4);
		TreeNode rightChild1Node = new TreeNode(3);
		TreeNode rightChild2Node = new TreeNode(4);

//		leftNode.left = leftChild1Node;
//		leftNode.right = leftChild2Node;
//		rightNode.left = rightChild2Node;
//		rightNode.right = rightChild1Node;

		headNode.setLeft(leftNode);
		headNode.setRight(rightNode);
		return headNode;
	}
}

除了递归的方法外,我们也可以利用队列进行迭代。队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。最初,队列中包含的是 root 以及 root。该算法的工作原理类似于 BFS,但存在一些关键差异。每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。(BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表))

 

性能结果:

复杂度分析:

  • 时间复杂度:O(n),因为我们遍历整个输入树一次,所以总的运行时间为 O(n),其中 n 是树中结点的总数。
  • 空间复杂度:搜索队列需要额外的空间。在最糟糕情况下,我们不得不向队列中插入 O(n) 个结点。因此,空间复杂度为 O(n)。

 

其他:

Queue<TreeNode> queue = new LinkedList<>();

Deque接口继承了Queue接口,而Queue接口继承了Collection接口,
LinkedList实现了Deque接口;
关系很明显了吧:(顶级接口)Collection-->Queue-->Deque-->LinkedList(实现类)

 

LeetCode Hot100 刷题笔记(4)—— 二叉树、图论 一、二叉树:二叉树的中序遍历,二叉树的最大深度,翻转二叉树,对称二叉树,二叉树的直径,二叉树的层序遍历,将有序数组转换为二叉搜索树,验证二叉搜索树,二叉搜索树中第 K 小的元素,二叉树的右视图,二叉树展开为链表,从前序与中序遍历序列构造二叉树,路径总和 III,二叉树的最近公共祖先,二叉树中的最大路径和。 二、图论:岛屿数量,腐烂的橘子,课程表,实现 Trie (前缀树)。 阅读详情

相关推荐

Leetcode编程题:高频题100道

难度 简单:26 中等:59 困难:15 题目类型 数组:字符串:二叉树:动态规划: 题号 题目 难度 标签 1 两数之和 简单 2 两数相加 中等 3 无重复字符的最长子串 中等 4 寻找两个有序数组的中位数 困难 5 最长回文子串 中等 10 正则表达式匹配 困难 11 盛最多水的容器 中等 15 三数之和 中等 17 电话号码的...

Coding 8456

Leetcode 101. 对称二叉树

Leetcode 101. 对称二叉树1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/symmetric-tree/   本质上就是一个二叉树的深度优先搜索问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "a

珍惜 8862

2021.5.21开始的兔系刷题之路 根据LeetCode分类进行逐个击破 培养出自己的套路~

从前辈们的学习经验中获得建议 并开始一点点地实践 争取一天可以刷一道题 慢慢地把这些专题都刷过来!

一碗菜粥的博客 2566

【LeetCode】101. 对称二叉树

文章摘要: 本题要求判断二叉树是否轴对称。核心思路是递归或迭代比较左右子树的镜像位置:左子树的左节点对应右子树的右节点,左子树的右节点对应右子树的左节点。递归法代码简洁,时间复杂度O(n),空间复杂度O(h);迭代法(BFS/DFS)虽然空间复杂度可能达到O(n),但更直观易懂。关键点在于处理边界条件(空节点比较)和同步遍历镜像节点。典型测试用例包括完全对称树、结构不对称树和单节点树等情况。最优解推荐递归实现,既高效又易于理解。

qq_32019341的博客 1067

LeetCode——101,对称二叉树

/** * \* Created: liuhuichao * \* Date: 2019/8/22 * \* Time: 35:53 AM * \* Description: 对称二叉树 * 给定一个二叉树,检查它是否是镜像对称的。 * <p> * 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 * <p> * 1 * / \ * ...

我们的征途是星辰大海 669

Silvaco二极管、三极管、CMOS的制备

Silvaco二极管和三极管的制备

yytu231的博客 5749

LeetCode刷题101-简单-对称二叉树

算法作为极其重要的一点,是大学生毕业找工作的核心竞争力,所以为了不落后与人,开始刷力扣算法题!

布小禅的博客 5781

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3486

【LeetCode】【数据结构】二叉树必刷OJ题

本篇文章博主给大家带来了几道经典的二叉树OJ题,快来试试你对于递归的理解到底如何?

℉f的博客 1165

数仓建模—数据治理框架选型

全名主要亮点覆盖面最广:从数据治理、架构、质量、安全到元数据、主数据、数据仓库等等,几乎所有数据管理主题都能在DMBOK里找到相应章节。概念权威统一:帮助组织建立通用术语和知识基础,减少“部门之间说法不一致”的沟通成本。适用场景:如果你所在公司(或团队)正准备系统梳理数据管理的方方面面,DMBOK是一份非常全面的指导手册,尤其适合培养新人或为整个组织统一认知。需要注意:DMBOK偏“知识指引”,不直接提供成熟度模型或实施路线图。想要落地,还需要结合其他评估模型或项目管理方法。小案例举例:某。

2401_84052244的博客 4743

Vue3 - 完美解决高德地图定位失败 Get ipLocation failed.Geolocation permission denied.(获取ipLocation失败。地理定位权限被拒绝。)

Get ipLocation failed.Geolocation permission denied.,vue3引入高德地图当前定位失败 ,vue3中使用高德地图定位报错,高德地图API用户定位失败,高德地图H5 定位失败报错排查和解决方案,微信公众号H5网页高德地图定位报错,谷歌浏览器-高德地图定位失败geolocation,getCurrentPosition 返回的 message报错,如何解决此问题,uniapp h5高德地图,微信、QQ等内置浏览器定位失败,高德地图实现实时用户位置定位,引入高德

🏆 前端领域优质创作者 4171

力扣(简单+中等)50题整理总结

简单整理:200题做一遍不如50题做三遍 (干货)

卉卉的博客 1万+

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 598

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

【FISCO-BCOS】十一、一键部署

一键部署包括以下服务:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。部署成功后,登录此网站:http://localhost:5000 访问WeBASE管理平台。快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。修改节点管理子系统和签名服务组系统的mysql数据库配置。如使用root账户:改为。配置方法:参考如下指令。

naihe_fish的博客 2596

【Coze搞钱实战】24. 从零实现精准用户画像:Coze+企业微信打造智能导购推送系统(附完整代码)

电商运营中,“客服重复询问用户需求、无法精准推荐”是转化率低的核心痛点——日均200人次咨询,73%的问题是重复的,首单转化率仅14%。本文基于Coze平台sys_uuid用户识别功能、企业微信API与多维表格,打造“用户行为→自动打标→标签存储→智能推送”全链路方案:通过分类分层标签体系捕捉用户偏好,Coze自动识别用户并打标,飞书多维表格存储标签数据,企业微信触发个性化推送。实操后可使客服重复询问率下降62%,意向客户转化率提升81%,首单转化率提升64%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 543

力扣---二叉树OJ题(多种题型二叉树)

第十三弹 --- 力扣LeetCode每日一题

小沈.的博客 2329

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3543

LeetCode 对称二叉树(101题)

LeetCode 对称二叉树 @author:Jingdai @date:2020.11.03 题目描述(101题) 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 思路 1.递归方法 如图,可以看出一个对称二叉树的左子树和右子树是镜像对称的,同时左子树的左子树又是和右子树的右子树镜像对称的,左子树的右子树是和右子树的左子树镜像对称的…这不就是一个典型的递归问题吗?根据这个性质

qq_41512783的博客 267

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

<数据结构>来,一起刷题吧——二叉树(单值二叉树、相同的树、对称二叉树、另一棵树的子树、前序遍历)

文章目录1. 单值二叉树链接思路参考代码2. 相同的树链接思路参考代码3. 对称二叉树链接思路参考代码4. 另一棵树的子树链接思路参考代码5. 二叉树的前序遍历链接思路参考代码 目前在不断更新<数据结构>的知识总结,已经更新完了<C语言>,未来我会系统地更新<C++语言><Linux系统编程><Linux网络编程><MySQL数据库>等内容。 上一篇相关博客:<数据结构>链式二叉树的基本操作 本文是在上一篇相关博客的基础上进阶的刷.

qq_47882731的博客 904

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 热题 HOT 100【题型归类汇总,助力刷题】

LeetCode 热题 HOT 100🔥【题型归类汇总】,超详细,不断优化ing ...

梦~' 3万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

代码随想录刷题day14丨226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,**111.二叉树的最小深度**

文档讲解:https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html。文档讲解:https://programmercarl.com/0111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.html。解题思路:递归(后序遍历)

m0_75195038的博客 865

LeetCode 力扣 101. 对称二叉树

题目描述(简单难度) 判断一个二叉树是否关于中心轴对称。 解法一 和 100 题 判断两个二叉树是否相等其实是一样的思路,都是用某种遍历方法来同时遍历两个树,然后看是否对应相等。 这里的需要遍历的两个树就是左子树和右子树了。 这里的对应相等的话,因为判断左子树 A 和右子树 B 是否对称,需要判断两点。 A 的根节点和 B 的根节点是否相等 A 的左子树和 B 的右子树是否相等,同时 A 的右...

wind_liang的博客 906

⭐算法入门⭐《二叉树》简单03 —— LeetCode 101. 对称二叉树

《二叉树》简单03 —— LeetCode 101. 对称二叉树

英雄哪里出来 6806

刷题小记 (3) LeetCode 101 对称二叉树 PLUS(Integer的比较)

LeetCode 101 2020.8.12 我的通过代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSymmetric(Tre

ahhhhhjaksf的博客 297

力扣101 对称二叉树

LEETCODE 101 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 class TreeNode: def __init__(self, x): self.va

码农ZZK的博客 328
上一篇: FAQ(89): org.jooq.exception.DataAccessException: SQL [insert into "eh_short_url"."eh_url_mapping" ("
下一篇: 后端日志【17】:时间过的很快,坚持自我修炼的第四个月又10天,我现在有什么感觉呢?
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值