当前位置: 首页 > news >正文

LeetCode:对称二叉树

1、题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

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

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内

  • -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

2、方法1:递归法

解题思路

递归法通过比较左右子树的对称性来判断整棵树是否对称。

步骤:

  1. 终止条件

    • 左右节点均为 null,返回 true

    • 左右节点有一个为 null,返回 false

    • 左右节点值不相等,返回 false

  2. 递归比较

    • 比较左子树的左节点与右子树的右节点。

    • 比较左子树的右节点与右子树的左节点。

  3. 返回结果:上述两个比较结果必须同时为 true

时间复杂度:O(n),空间复杂度:O(n) (调用栈)

public boolean isSymmetric(TreeNode root) {if (root == null) return true;return isMirror(root.left, root.right);
}private boolean isMirror(TreeNode l, TreeNode r) {if (l == null && r == null) return true;  // 均为空if (l == null || r == null) return false; // 一个为空if (l.val != r.val) return false;         // 值不相等return isMirror(l.left, r.right) && isMirror(l.right, r.left); // 递归比较
}

3、方法2:迭代法

解题思路

迭代法通过队列按层比较左右子树的对称性。

步骤:

  1. 初始化:将根节点的左右子节点入队。

  2. 循环处理队列

    • 每次取出两个节点(左子树的节点和右子树的节点)。

    • 检查是否均为 null,是则跳过。

    • 检查是否一个为 null 或值不相等,是则返回 false

    • 将左子树的左节点与右子树的右节点入队(比较外侧)。

    • 将左子树的右节点与右子树的左节点入队(比较内侧)。

  3. 返回结果:队列为空时未发现不对称,返回 true

时间复杂度:O(n),空间复杂度:O(n) (栈空间)

public boolean isSymmetric(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while (!queue.isEmpty()) {TreeNode u = queue.poll();TreeNode v = queue.poll();if (u == null && v == null) continue;       // 均为空if (u == null || v == null) return false;   // 一个为空if (u.val != v.val) return false;           // 值不相等queue.offer(u.left);  // 左子树的左节点queue.offer(v.right); // 右子树的右节点queue.offer(u.right); // 左子树的右节点queue.offer(v.left);  // 右子树的左节点}return true;
}

http://www.xdnf.cn/news/326233.html

相关文章:

  • 贵州省棒球运动发展中长期规划(2024-2035)·棒球1号位
  • MySQL 联合查询的使用教程
  • Consumer Group的作用是什么?Rebalance的触发条件有哪些? (实现消费者负载均衡;消费者加入/离开、订阅Topic变化等)
  • JAVA中常见队列详解-非线程安全
  • by 组态在化工生产线自动化控制中的应用方案
  • 工具分享:通过滑块拉取CAN报文信号数值自动发送报文
  • Python小酷库系列:Box,更为完善的dict属性化访问扩展库
  • 技术视界 | 青龙机器人训练地形详解(一):如何创建一个地形
  • HTB - Eureka记录
  • 数智管理学(八)
  • 《饶议科学》阅读笔记
  • 【Lanqiao】数位翻转
  • 2021年下半年试题四:论微服务架构及其应用
  • SQL Server 中的 GO 及其与其他数据库的对比
  • Spark-Core(双Value类型)
  • C++对象注册系统(1)实现原理
  • 应用 | AI 自动化某讯会议转录与摘要生成系统
  • Android开发-视图基础
  • Facebook的元宇宙新次元:社交互动如何改变?
  • 2021年CVPR文章【Polygonal Building Segmentation by Frame Field Learning】环境搭建
  • 《Python星球日记》 第47天:聚类与KMeans
  • Kotlin zip 函数的作用和使用场景
  • 镜像和容器的管理
  • Qwen2.5模型结构
  • QT编程练习20250507
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.1 主流可视化工具对比(Tableau/Matplotlib/Python库)
  • FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法
  • 算法专题四:前缀和
  • 【北京迅为】iTOP-4412精英版使用手册-第八章 Android 4.4系统编译
  • neo4j多跳查询,未只获取到收尾两个节点,待继续