leetcode 101. 对称二叉树

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

题目描述

题目链接: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

分析

画一棵层数较多的对称二叉树:
在这里插入图片描述  可以发现一个规律:只要在相同的层数往不同的方向(一个往左另一个就往右)遍历,就会走出一条对称的路径。只有当所有对称的路径上的数值都对应相等时,二叉树才可能是对称二叉树。
请结合下图理解上面的规律(图中对称的路径“颜色相同”)。
在这里插入图片描述对于“当前的根结点root”,只需要作以下几个判断:
(1)root的右儿子和左儿子是否相等。
(2)root的“右儿子的右儿子”和root的“左儿子的左儿子”是否相等。
(3)root的“右儿子的左儿子”和root的“左儿子的右儿子”是否相等。
只有(1)(2)(3)三种情况都判断为相等时,二叉树才可能是对称二叉树。
请结合下图理解:
在这里插入图片描述继续往下判断时,应当把“右儿子的右儿子”和“左儿子的左儿子”视作同一个节点的左右儿子,把“右儿子的左儿子”和root的“左儿子的右儿子”视作同一个节点的左右儿子。实际上这就是“走对称路径”的过程。(结合下图理解)
在这里插入图片描述

由二叉树的递归结构和本问题中存在的“局部问题的相似性”,可以设计一个递归解法。

代码一

此代码较繁琐, 但是能很好地展现“由当前节点往下扩展两层的具体情况分类”。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //检查以左儿子和右儿子为根结点的两棵子树是否对称
    bool check(TreeNode* l,TreeNode* r){
       if(l==nullptr&&r==nullptr) return true;
       if(l!=nullptr&&r==nullptr) return false;
       if(l==nullptr&&r!=nullptr) return false;
           if(l->val==r->val){   //(1)
               if(l->left!=nullptr&&r->right==nullptr)  return false;
               if(l->left==nullptr&&r->right!=nullptr)  return false;
               if(l->right!=nullptr&&r->left==nullptr)  return false;
               if(l->right==nullptr&&r->left!=nullptr)  return false;
               if(l->left==nullptr&&r->right==nullptr&&l->right==nullptr&&r->left==nullptr) return true;
               if(l->left==nullptr&&r->right==nullptr&&l->right!=nullptr&&r->left!=nullptr){  //(2)
                   if(l->right->val==r->left->val) {
                   return check(l->right,r->left);
                   }
                   return false;
               }  //(2)
               if(l->left!=nullptr&&r->right!=nullptr&&l->right==nullptr&&r->left==nullptr){ //(3)
                   if(l->left->val==r->right->val) {
                   return check(l->left,r->right);
                   }
                   return false;
               }    //(3)
               if(l->left!=nullptr&&r->right!=nullptr&&l->right!=nullptr&&r->left!=nullptr){  //(4)
                   if(l->left->val==r->right->val&&l->right->val==r->left->val) {
                   return check(l->right,r->left)&&check(l->left,r->right);
                   }
                   return false;
               } //(4)
               
            }   //(1)
          return false;
    }

    bool isSymmetric(TreeNode* root) {
    if(root==nullptr) return true;
    return check(root->left,root->right);
    }
};

代码二

参考官方题解,和上面其实是同一个思想。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool check(TreeNode* l,TreeNode* r){
       if(l==nullptr&&r==nullptr) return true;
       if(l!=nullptr&&r==nullptr) return false;
       if(l==nullptr&&r!=nullptr) return false;
       return l->val==r->val&&check(l->left,r->right)&&check(l->right,r->left);
    }
    bool isSymmetric(TreeNode* root) {
    if(root==nullptr) return true;
    return check(root->left,root->right);
    }
};

【简单】力扣算法题解析LeetCode101:对称二叉树 本文探讨了如何判断二叉树是否对称的问题。通过递归和迭代两种方法实现:递归法通过比较左右子树的镜像关系(左左对右右,左右对右左)实现高效判断,时间复杂度O(n);迭代法则利用队列按层比较对称节点。两种方法均需处理空节点和值不等的边界条件。递归法代码简洁,适合小规模树;迭代法避免栈溢出,适合大规模数据。附Java实现代码及LeetCode提交结果,展示了两种方法的时间/空间复杂度对比。 阅读详情

相关推荐

leetcode中国-LeetCode101:《LeetCode101》例题及练习题

leetcode中国 LeetCode 101 :和你一起轻松刷题 第 2 章 最易懂的贪心算法 例题 455 分发饼干 135 分发糖果 435 无重叠区间 练习 605 种花问题 452 用最少的数量引爆气球 763 划分字母区间 122 买股票的最佳时机2 406 根据身高重建队列 665 非递减数列 总结:分配问题、区间问题   第 3 章 玩转双指针 例题 167 两数之和 2 88 合并两个有序数组 142 环形链表 2 76 最小覆盖字串 练习 633 平方数之和 680 验证回文字符串 524 通过删除字母匹配到字典里最长单词 总结:Two Sum、归并两个有序数组、快慢指针、滑动窗口   第 4 章 居合斩!二分查找 例题 69 x 的平方根 34 在排序数组中查找元素的第一个和最后一个位置 81 搜索旋转排序数组2 练习 154 寻找旋转排序数组中的最小值 540 有序数组中的单一元素 4 寻找两个有序数组的中位数 总结:求开方(牛顿迭代法)、查找区间、旋转数组查找数字   第 5 章 千奇百怪的排序算法 例题 215 数组中的第K个最大元素 347 前K个高频元素

【经典算法】LeetCode101:对称二叉树(Java/C/Python3实现含注释说明,Easy)

方法优点缺点时间复杂度空间复杂度递归法- 直观易懂- 代码相对简洁- 可能导致函数调用栈溢出的风险- 需要额外的空间来存储函数调用栈O(n)O(n)队列法- 不会导致函数调用栈溢出的风险- 无需递归,代码较为直观- 灵活的节点入队和出队顺序- 需要手动维护队列数据结构和追踪节点的层次- 需要额外的空间来存储队列和节点的信息O(n)O(m)

2072

leetcode_101:LeetCode 101:和你一起你轻松刷题(C ++)

leetcode_101:LeetCode 101:和你一起你轻松刷题(C ++)

101.对称二叉树

101.对称二叉树 题目地址:https://leetcode-cn.com/problems/symmetric-tree/ 给你一个二叉树的根节点 root, 检查它是否轴对称。 示例1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例2: 输入:root = [1,2,2,null,3,null,3] 输出:false 思路: 首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点! 对于二叉树是否对称,要比较的是根节点.

coolshyman的博客 775

Ubuntu20.04下Intel AX201网卡驱动安装全攻略:从内核升级到固件更新

本文详细介绍了在Ubuntu 20.04系统上解决Intel AX201无线网卡驱动问题的完整方案。针对戴尔游匣G15等新硬件,通过升级内核至HWE版本、从官方仓库获取最新固件文件,并调整BIOS设置,彻底解决Wi-Fi无法识别或连接不稳定的问题,为开发者提供了一套从诊断到修复的实践指南。

gpt4scribbler的博客 690

告别反复格式化!用Ventoy制作2025年终极启动盘,Windows/Linux/macOS一网打尽

本文详细介绍了如何使用Ventoy制作2025年终极多系统启动盘,彻底告别反复格式化U盘的烦恼。Ventoy通过创新的引导加载器架构,允许用户在一个U盘内同时存放并直接启动Windows、Linux、macOS等多种系统镜像和WePE等维护工具,实现真正的非破坏性管理和极高的U盘利用率。文章涵盖从安装配置、镜像库构建到安全启动设置等全流程实战指南。

weixin_29280219的博客 242

101. 对称二叉树

这题让我做麻烦了,不过我思路也很对。两颗二叉树如果序列化结果事一样的,那么两个完全一样。如果镜像对称,序列化的时候一个先插入左子节点,一个先插入右子节点。有个代码有点傻,我为了能用要一个函数就解决,用了个傻了吧唧的bool变量。

qigezuishuaide的博客 555

短视频mssdk中get_token协议逆向与加密流程深度解析

本文深度解析了短视频mssdk中get_token协议的逆向分析与加密流程。通过抓包、Frida Hook、静态分析等手段,详细拆解了协议数据的Protobuf结构、设备信息采集来源,并重点剖析了其核心加密链路:zlib压缩、自定义TEA算法与AES-CBC加密,最终实现完整的协议模拟。

flower的专栏 555

leet101. 对称二叉树

题目:给定一个二叉树,检查它是否是它自己的镜像(即,围绕它的中心对称)。例如,这个二叉树 [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  说明:如果你可以递归地和迭代地解决它就...

404NotFound 3258

LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

solomonzw的博客 3239

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 188

LeetCode 101.对称二叉树(DFS、BFS)

给定一个二叉树,检查它是否是镜像对称的。

晴空๓ 5232

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

LeetCode 101 ----- 对称二叉树

LeetCode 101 ----- 对称二叉树 题目描述 给定一个二叉树,检查它是否是镜像对称的。 思路 **对称,可以看做镜像 根节点为 null,则为对称二叉树 如果两个数都是空树,算镜像 两个数一个为空,有个非空,则不是镜像 如果两个树都不为空 a)比较根节点是不是相同,不相同就不是镜像 b)递归比较子树,t1.left 和 t2.right , t1.right 和 t2.left 是...

lsy18392609095的博客 170

24. SAP UI5 应用如何使用 OData 数据模型

本教程之前的二十三个步骤,使用的数据模型都是 JSON 模型。从本步骤开始,我们要学习另一种非常重要的数据模型:OData 数据模型。 OData 数据模型也是 SAP 产品里广泛使用的数据模型,比如 SAP S/4HANA,SAP CRM Fiori 应用等等,都使用的是 OData 数据模型而不是 JSON 数据模型。 使用 OData 数据模型的典型场景就是,通过 OData 模型提供的 Read API,将远端服务器上存储的数据通过 OData 协议读取到客户端,并显示在 SAP UI5 应用里。.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5797

《多模态融合改进》目录一览 | 专栏介绍 :全网 第一份 完整的多模态改进教程,提供《多模态模型改进完整项目包》-开箱即用

在大家订阅专栏后,便可获得多模态模型改进完整项目包-开箱即用,方便简单

Limiiiing的博客 1万+

LeetCode 力扣 101. 对称二叉树

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

wind_liang的博客 906

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

瑞_力扣LeetCode_101. 对称二叉树

本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列,主要以力扣LeetCode网的题进行解析与分享。力扣LeetCode_101. 对称二叉树

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 1389

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

101. 对称二叉树【 力扣(LeetCode) 】

给你一个二叉树的根节点 root , 检查它是否轴对称。进阶:你可以运用递归和迭代两种方法解决这个问题吗?

yyh520025的博客 1234

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

力扣 101 对称二叉树【递归三步法】

力扣 101 对称二叉树【递归三步法】 文章目录力扣 101 对称二叉树【递归三步法】全部刷题与学习记录原题目考查知识点自己的第一遍解法好的解法 全部刷题与学习记录 【C++刷题学习笔记目录】 【C++百万并发网络通信-笔记目录】 原题目 题目地址:101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3

日月既往,不可复追 485

【力扣】101.对称二叉树

力扣 101题对称二叉树 c++解法

Father_Of_Soft的博客 315

《LeetCode力扣练习》第101题 对称二叉树 Java

《LeetCode力扣练习》第101题 对称二叉树 Java 一、资源 题目: 给你一个二叉树的根节点 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 进阶:你可以运用递归和迭代两种方法解决这个问题吗? 来源:力扣(LeetC

XRT_knives的博客 297

LeetCode101(力扣101):对称二叉树 C++

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 Solution { public: bool isDCtre

VegetableGirl的博客 507

LeetCode 101. 对称二叉树

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 101. 对称二叉树,做好准备了么,那么开始吧。 🌲🌲🐴🐴

weixin_62275996的博客 760
上一篇: leetcode 105. 从前序与中序遍历序列构造二叉树
下一篇: leetcode 127. 单词接龙(bfs+建图+最短路)
准图灵奖得主
博客等级 码龄8年 355粉丝 135原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值