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

【LeetCode热题100道笔记】对称二叉树

题目描述

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

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

思考一:递归

核心是定义「镜像检查函数」,递归验证左右子树的对应节点是否满足镜像条件,本质是深度优先遍历(DFS)

算法过程

  1. 边界处理:若树为空(题目提示节点数≥1,可省略),直接返回true;否则调用check函数,传入根节点的左、右子树(从根的左右子树开始验证镜像)。
  2. 镜像检查函数(check(p, q))
    • 终止条件1:若pq均为null(对应位置均无节点),返回true(符合镜像);
    • 终止条件2:若pq中一个为null、一个非null(对应位置节点缺失),返回false(不符合镜像);
    • 值判断:若p.val !== q.val(对应位置节点值不同),返回false
    • 递归验证:递归检查p的左子树与q的右子树(镜像位置1)、p的右子树与q的左子树(镜像位置2),两者均为true才返回true
  • 时间复杂度 O(n)O(n)O(n)、空间复杂度 O(h)O(h)O(h)(h为树高)。

代码

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {boolean}*/
var isSymmetric = function(root) {return check(root.left, root.right);
};function check(p, q) {if (!p && !q) return true;if ((!p && q) || (p && !q)) return false;if (p.val !== q.val) return false;return check(p.left, q.right) && check(p.right, q.left);
}

思考二:迭代实现(BFS)

核心是用队列存储每一层的节点,通过“相向双指针”验证当前层是否对称,再按“镜像顺序”(右子节点先入队、左子节点后入队)存储下一层节点,本质是广度优先遍历(BFS)

算法过程

  1. 初始化队列:若树为空(题目节点数≥1,可省略)返回true;否则将根节点的左、右子树入队(从根的左右子树开始验证)。
  2. 层序遍历与对称验证
    • 当前层验证:定义双指针l=0(层首)、r=队列长度-1(层尾),相向移动检查对应节点:
      • 若两者一个为null、一个非null,返回false
      • 若均非null但值不同,返回false
    • 存储下一层节点:弹出当前层所有节点,若节点非null,按“右子节点→左子节点”的顺序入队(保证下一层验证时,对应位置仍是镜像节点);
  3. 循环终止:若所有层均验证通过,队列空时返回true
  • 时间复杂度 O(n)O(n)O(n)、空间复杂度 O(n)O(n)O(n)(队列存储)。

代码

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {boolean}*/
var isSymmetric = function(root) {let queue = [root.left, root.right];while (queue.length) {let tmp = [];let l = 0, r = queue.length-1;while (l < r) {if (!queue[l] || !queue[r]) {if (queue[l] || queue[r]) {return false;}} else if (queue[l].val !== queue[r].val) {return false;}l++;r--;}while (queue.length) {let p = queue.pop();if (p) {tmp.push(p.right);tmp.push(p.left);}}queue = tmp;}return true;
};

文章转载自:

http://hm8qHl9l.fdrch.cn
http://Bjvc0UwV.fdrch.cn
http://nkf1bUnh.fdrch.cn
http://fiW6UPYN.fdrch.cn
http://EaX3KdRr.fdrch.cn
http://LjfxcXaX.fdrch.cn
http://j9wVpboC.fdrch.cn
http://CQZncbYr.fdrch.cn
http://3pbeKPft.fdrch.cn
http://jHwmmrbI.fdrch.cn
http://1INB4Puw.fdrch.cn
http://S1STpMPL.fdrch.cn
http://2s5OGq4U.fdrch.cn
http://uoX3cQIo.fdrch.cn
http://siGLpGjm.fdrch.cn
http://E2UPcEqm.fdrch.cn
http://H5ObVDUo.fdrch.cn
http://zBheUmcn.fdrch.cn
http://BNiZFvaB.fdrch.cn
http://7xP2ucYe.fdrch.cn
http://ATcH43dD.fdrch.cn
http://Meb7O13j.fdrch.cn
http://xkryuKMD.fdrch.cn
http://E3p6e5VJ.fdrch.cn
http://6W01Dr5C.fdrch.cn
http://AOZS3nG1.fdrch.cn
http://TORI4LpX.fdrch.cn
http://yNzsijJT.fdrch.cn
http://RStWW5Kz.fdrch.cn
http://9mCofYwu.fdrch.cn
http://www.dtcms.com/a/369906.html

相关文章:

  • MySQL与ES索引区别
  • 捷多邦揭秘超厚铜板:从制造工艺到设计关键环节​
  • Nestjs框架: 基于权限的精细化权限控制方案与 CASL 在 Node.js 中的应用实践
  • Zynq设备与电脑相连方式
  • 《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
  • 【数据结构】带哨兵位双向循环链表
  • Python基础之封装单继承
  • [数据结构] ArrayList(顺序表)与LinkedList(链表)
  • Fantasia3D:高质量文本到3D内容创建工具
  • Elasticsearch面试精讲 Day 10:搜索建议与自动补全
  • 【3D算法技术】blender中,在曲面上如何进行贴图?
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘mkdocs’问题
  • 【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优
  • 推荐的Java服务环境:JDK17+ZGC(JDK 21的ZGC支持分代回收,性能更高)
  • [光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?
  • 心路历程- Linux用户组的整理
  • 前端登录鉴权详解
  • CodeSandbox Desktop:零配置项目启动工具,实现项目环境隔离与Github无缝同步
  • Lua > Mac Mini M4安装openresty
  • SpringBootWeb 篇-深入了解 ThreadLocal 存在内存泄漏问题
  • Django 项目6:表单与认证系统
  • 【架构艺术】通过标准化事件解决变更检测能力的调度问题
  • Eureka与Nacos的区别-服务注册+配置管理
  • Python毕业设计推荐:基于Django的饮食计划推荐与交流分享平台 饮食健康系统 健康食谱计划系统
  • 基于 Gemini 的 CI/CD 自动化测评 API 集成实战教程
  • 基于定制开发开源AI智能名片S2B2C商城小程序的DMP平台离线文件上传功能优化研究
  • 友猫社区APP源码与小程序端部署详解
  • HJ65查找两个字符串a,b中的最长公共子串(medium,dp,进入题目后题目序号是HJ21)
  • 如何减少微型导轨表面破损情况?
  • Python中list()使用详解及注意事项