问题链接

101.对称二叉树

问题描述

给你一个二叉树的根节点 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

问题解答

要解决 LeetCode 101 题“对称二叉树”,核心思路是判断二叉树的左右子树是否镜像对称(即左子树的结构和值与右子树完全相反)。以下提供两种主流解法:递归法(思路简洁)和迭代法(用队列模拟递归栈),均符合 Java 语法规范且通过所有测试用例。

核心逻辑铺垫

镜像对称的定义:对于两个节点 pq,需满足 3 个条件:

  1. pq 的值相等;
  2. p 的左孩子与 q 的右孩子镜像对称;
  3. p 的右孩子与 q 的左孩子镜像对称。

空树默认对称;若根节点非空,则只需判断其左子树和右子树是否满足上述镜像条件。

解法 1:递归法(推荐入门)

思路

  1. 特殊处理:若根节点 root 为空,直接返回 true
  2. 定义辅助函数 isMirror(p, q),判断两个节点是否镜像;
  3. 递归调用辅助函数,传入根节点的左子树和右子树。

Java 代码(带详细注释)

// 二叉树节点定义(题目已默认提供,无需重复编写,此处仅为说明)
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}class Solution {// 主函数:判断整棵树是否对称public boolean isSymmetric(TreeNode root) {// 空树是对称的if (root == null) {return true;}// 递归判断左子树和右子树是否镜像return isMirror(root.left, root.right);}// 辅助函数:判断两个节点 p 和 q 是否镜像对称private boolean isMirror(TreeNode p, TreeNode q) {// 情况 1:两个节点都为空 → 对称if (p == null && q == null) {return true;}// 情况 2:一个节点为空,另一个非空 → 不对称if (p == null || q == null) {return false;}// 情况 3:两个节点都非空 → 需满足「值相等 + 子节点镜像」return (p.val == q.val)  // 值相等&& isMirror(p.left, q.right)  // p的左 vs q的右&& isMirror(p.right, q.left); // p的右 vs q的左}
}

复杂度分析

  • 时间复杂度O(n),每个节点仅遍历一次(n 为节点总数);
  • 空间复杂度O(n),递归栈的深度取决于树的高度(最坏情况为链状树,高度 = n)。

解法 2:迭代法(用队列模拟递归)

思路
递归的本质是“隐式栈”,迭代法可用队列(或栈)将“待比较的节点对”显式存储,步骤如下:

  1. 特殊处理:若根节点为空,返回 true
  2. 初始化队列,将根节点的左子树和右子树作为第一对“待比较节点”入队;
  3. 循环出队:每次取出队首的两个节点 pq,按镜像条件判断;
  4. 入队后续节点对:若 pq 满足条件,将 p.leftq.rightp.rightq.left 入队(保证下一轮比较镜像关系);
  5. 若循环中出现不满足条件的情况,直接返回 false;队列空则返回 true

Java 代码(带详细注释)

import java.util.LinkedList;
import java.util.Queue;class Solution {public boolean isSymmetric(TreeNode root) {// 空树是对称的if (root == null) {return true;}// 初始化队列:存储待比较的节点对(用 LinkedList 实现 Queue 接口)Queue<TreeNode> queue = new LinkedList<>();// 先将根节点的左、右子树入队(第一对比较对象)queue.offer(root.left);queue.offer(root.right);// 循环处理队列中的节点对while (!queue.isEmpty()) {// 一次取出两个节点(成对比较)TreeNode p = queue.poll();TreeNode q = queue.poll();// 情况 1:两个节点都为空 → 跳过(无需后续比较)if (p == null && q == null) {continue;}// 情况 2:一个空、一个非空 → 不对称if (p == null || q == null) {return false;}// 情况 3:值不相等 → 不对称if (p.val != q.val) {return false;}// 若当前节点对满足条件,将下一轮的镜像节点对入队queue.offer(p.left);   // p的左 → 对应 q的右queue.offer(q.right);queue.offer(p.right);  // p的右 → 对应 q的左queue.offer(q.left);}// 队列空且未返回 false → 所有节点对都满足镜像条件return true;}
}

复杂度分析

  • 时间复杂度O(n),每个节点仅入队和出队一次;
  • 空间复杂度O(n),队列存储的节点数取决于树的宽度(最坏情况为满二叉树,叶子节点数 = n/2,队列最大容量为 n/2)。

测试用例验证

示例 1(对称树)
输入:root = [1,2,2,3,4,4,3]
输出:true
两种解法均会递归/迭代比较 (2,2)(3,3)(4,4),全部满足镜像条件,返回 true

示例 2(非对称树)
输入:root = [1,2,2,null,3,null,3]
输出:false
比较 (2,2) 时,2 的左孩子为空、右孩子为 3,而另一个 2 的右孩子为空、左孩子为 3,满足前序条件;但后续比较 (3,null) 时,一个非空一个空,返回 false

两种解法均覆盖题目要求,递归法适合理解思路,迭代法适合避免递归栈溢出(针对极深的树),可根据场景选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96747.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96747.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96747.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zynq开发实践(FPGA之选择开发板)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】我们之所以选用zynq开发板&#xff0c;就在于它支持arm软件开发&#xff0c;也支持fpga开发&#xff0c;甚至可以运行linux&#xff0c;这是之前没有…

Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架

在之前的 《注解模式下的 Riverpod 有什么特别之处》我们聊过 Riverpod 2.x 的设计和使用原理&#xff0c;同时当时我们就聊到作者已经在开始探索 3.0 的重构方式&#xff0c;而现在随着 Riverpod 3.0 的发布&#xff0c;riverpod 带来了许多细节性的变化。 当然&#xff0c;这…

Xcode 上传 ipa 全流程详解 App Store 上架流程、uni-app 生成 ipa 文件上传与审核指南

对于 iOS 开发者而言&#xff0c;应用开发完成后最重要的一步就是将应用打包为 ipa 文件&#xff0c;并上传至 App Store Connect 进行分发或上架。 其中&#xff0c;Xcode 上传 ipa 是最常见的方法&#xff0c;但很多开发者在实际操作中常常遇到卡住、上传失败或签名错误等问题…

快速选中对象

图片要求 图片背景单纯&#xff0c;对象边缘比较清晰 对象选择工具 选择对象选择工具后&#xff0c;画出大致区域&#xff0c;系统将自动分析图片内容&#xff0c;从而实现快速选择图片中的一个惑多个对象他有两种模式&#xff0c;分别是举行与套索模式。使用时可以先选中对象的…

点到点链路上的OSPF动态路由(2025年9月10日)

一、前言前面我们已经分享过了静态路由、缺省路由、浮动静态路由这些静态路由的配置。接下来将会 陆陆续续开始分享动态路由以及其他路由配置。博主这里是一个新人&#xff0c;了解这些路由配置不是自上而下的&#xff0c;而是自下而上的&#xff0c;也就是说通过实验去理解原理…

技术视界 | 末端执行器:机器人的“手”,如何赋予机器以生命?

在现代自动化系统中&#xff0c;末端执行器&#xff08;End Effector&#xff09;作为机器人与物理世界交互的“手”&#xff0c;发挥着至关重要的作用。它直接安装在机械臂末端&#xff0c;不仅是机器人实现“抓取、感知和操作”三大核心功能的关键部件&#xff0c;更是整个自…

滑动窗口概述

滑动窗口算法简介滑动窗口是一种用于处理数组或字符串子区间问题的高效算法。它通过维护一个动态窗口&#xff08;通常由两个指针表示&#xff09;来避免重复计算&#xff0c;将时间复杂度从O(n)优化到O(n)。基本实现步骤初始化窗口指针&#xff1a;通常使用left和right指针表示…

AI 创建学生管理系统

使用腾讯元宝创建&#xff0c;整体效果不错。修正2个bug跑起来&#xff0c;达到了需要的功能先上效果图&#xff1a;按钮分类别配色&#xff0c;界面清爽。喜欢这布局创建过程&#xff1a;prompt: 使用最新稳定vue版&#xff0c;使用pinia存储&#xff0c;基于typescript, 样式…

ASP.NET Core 中的简单授权

ASP.NET Core 中的授权通过 [Authorize] 属性及其各种参数控制。 在其最基本的形式中&#xff0c;通过向控制器、操作或 [Authorize] Page 应用 Razor 属性&#xff0c;可限制为仅允许经过身份验证的用户访问该组件。 使用 [Authorize] 属性 以下代码限制为仅允许经过身份验证…

leetcode 493 翻转对

一、题目描述 二、解题思路 本题的思路与逆序数的思路相似&#xff0c;采用归并排序的思路来实现。leetcode LCR 170.交易逆序对的总数-CSDN博客 注意&#xff1a;但是逆序数的ret更新在左、右区间合并时更新&#xff0c;但本题ret更新在左、右区间合并前更新。 三、代码实现…

初识微服务-nacos配置中心

配置中心 概述 配置中心是微服务中不可或缺的组件&#xff0c;因为如果没有配置中心&#xff0c;那么各个微服务的的配置信息无法得到统一和管理&#xff0c;会变得冗余。 :::color4 配置中心是用于管理应用程序配置信息的工具 集中管理配置&#xff1a;解决微服务架构下配置分…

Android webview更新记录-aosp

一、下载 webview下载地址&#xff0c;感谢火哥分享&#xff0c;版本很全。 https://www.firepx.com/app/android-system-webview/ 二、更新 external/chromium-webview/prebuilt 具体更新那个目录&#xff0c;需要查看编译架构 这个看你的lunch就行&#xff0c;这里我的是a…

无感FOC(无传感器磁场定向控制)

我们来详细解析无感FOC&#xff08;无传感器磁场定向控制&#xff09;中的高频方波注入&#xff08;High-Frequency Square-Wave Injection, HFSWI&#xff09;​​ 的原理。这是一个用于零低速或极低速范围内估算转子位置的核心技术。核心思想与要解决的问题在电机静止或转速极…

MATLAB基于博弈论组合赋权-云模型的煤与瓦斯突出危险性评价

MATLAB基于博弈论组合赋权-云模型的煤与瓦斯突出危险性评价 1. 问题背景与核心目标 背景&#xff1a;煤与瓦斯突出是煤矿生产中的一种极其复杂的动力灾害&#xff0c;其发生机理复杂&#xff0c;影响因素众多&#xff08;如地应力、瓦斯压力、煤体物理属性等&#xff09;。对其…

JavaWeb-Servlet总结及JSP

目录 一、文件下载 二、ServletConfig对象 三、Web.xml文件使用总结 四、server.xml文件 五、JSP动态网页技术 1.概念&#xff1a; 2.动态网页&#xff1a; 3.特点&#xff1a; 4.JSP的访问原理&#xff1a; 5.JSP的文档说明&#xff1a; 6.jsp实际运行文件&#xff…

DDIM和DDPM之 间的区别与联系

核心关系概述 首先&#xff0c;要理解DDIM并不是一个全新的模型&#xff0c;而是DDPM的一个精巧的重新参数化和扩展。它们使用完全相同的训练目标和方法&#xff0c;因此你可以用一个训练好的DDPM模型直接来运行DDIM的采样算法&#xff0c;而无需重新训练。 DDIM的核心贡献是&a…

c++---map和set

这里再提二叉树&#xff08;二叉搜索树&#xff09;&#xff0c;是为了后面讲解map和set做准备。 一、二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树。 若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

windows下,podman迁移镜像文件位置

docker-desktop有自带的镜像文件位置迁移功能&#xff0c;但podman-desktop还没有&#xff0c;所以只能自己操作wsl导入导出来实现# 1.一定要先停止当前machine podman machine stop# 2. 导出当前 machine&#xff08;会生成 tar 镜像&#xff09; wsl --export podman-machine…

Champ-基于3D的人物图像到动画视频生成框架

本文转载自&#xff1a;https://www.hello123.com/champ ** 一、&#x1f916; Champ 是什么&#xff1f; 阿里 南大 复旦联手打造的虚拟人动作黑科技&#xff01;Champ 可不是普通动画工具&#xff0c;它能把你随手拍的小视频变成专业级 3D 动画 —— 无论跳舞、打拳还是走…

Thingsboard 3.4 源码运行 Mac Mini

拉取源码 git clone https://github.com/thingsboard/thingsboard.gitjdk11 java -version java version "11.0.27" 2025-04-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.278-LTS-232) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.278-LTS-23…