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

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

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

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

布小禅的博客 5781

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

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

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

℉f的博客 1165

端到端自动驾驶:特斯拉FSD Beta技术拆解

端到端自动驾驶:特斯拉FSD Beta技术拆解 ,人工智能,计算机视觉,大模型,AI,这篇文章围绕特斯拉FSD Beta的端到端自动驾驶技术展开,先介绍端到端自动驾驶的定义、与传统方案的区别及FSD Beta的特点,再阐述其硬件基础、技术架构,解析关键技术,还涉及训练数据与标注、安全与冗余设计、实际应用场景与挑战以及技术迭代与更新等内容,展现了该技术的多方面情况。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 212

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

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

卉卉的博客 1万+

【人工智能】向量数据库全生命周期数据安全防护体系:破解向量化与检索双环节泄露风险

大模型时代,向量数据库已成为RAG(检索增强生成)架构、语义检索、多模态应用的核心基础设施,解决了大模型幻觉、长上下文窗口限制、私有知识落地等核心痛点。但行业普遍存在认知误区:将Embedding向量等同于“无害的语义压缩乱码”,忽视了向量数据原生的泄露风险。

奶爸的编程之路,也就一周冷个三天 159

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万+

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析(零件转产品)

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析

KE17RS的博客 2145

【项目实战】分布式日志系统 之 Exactly-once 语义:确保数据处理的精确性

在分布式系统的数据传输与处理中,是一种核心可靠性保障,其目标是确保数据“仅被处理一次”——既不重复(避免多次处理),也不遗漏(避免未处理)。与,二者共同保障数据处理的精确性。Exactly-once 语义是分布式系统中数据可靠性的高级目标,其核心通过“幂等设计”(解决重复问题)和“分布式事务”(解决原子性问题)实现。在实际应用中,常结合 At-Least-Once 语义与幂等性,或通过事务 API 与唯一 ID 去重的组合,平衡可靠性与系统性能。

奶爸的编程之路,也就一周冷个三天 167

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

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

小沈.的博客 2329

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1710

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

qq_47882731的博客 904

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

梦~' 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

代码随想录刷题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、付费专栏及课程。

余额充值