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

【每天学习一点算法 2025/12/18】对称二叉树

每天学习一点算法 2025/12/18

题目:对称二叉树

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

  1. 老规矩先来递归, 检查二叉树是否轴对称,我们是不是得比较根节点下面得两个子树是否是轴对称,那么我们只需要递归比较两个子树的值即可,那要怎么传参呢?首先肯定是要将根节点的两个子节点作为初始传参传进去的,那么我们需要一个辅助函数,然后每次递归对称传递子结点比较。

    functionisSymmetric(root:TreeNode|null):boolean{if(!root)returntrue;// 空树默认为true// 定义辅助函数 递归比较两个子树functionvalidate(left:TreeNode|null,right:TreeNode|null):boolean{// 两个子节点同时为空才有轴对称的可能if(!left&&!right)returntrue;if(!left||!right)returnfalse;// 比较左右子节点的值,并传递对称的子节点递归returnleft.val===right.val&&validate(left.left,right.right)&&validate(left.right,right.left);}// 调用辅助函数returnvalidate(root.left,root.right);};
  2. 还有我们是不是可以用层序遍历的方法取得每一层的节点然后我们校验他们是否是对称就行了。核心思想其实跟递归是一样的,找到对称节点作比较。

    如果我们拓展下一层按照左左↔右右、左右↔右左的顺序入队列,那么每两个节点都是对称位置上的节点了,比如说我们有一个四层的结构对称的树,像下面这个样。

    1 / \ 2 3 / \ / \ 4 5 6 7 / \ / \ / \ / \ 8 9 10 11 12 13 14 15
    • 我们初始两个子节点入队列:[2, 3]
    • 然后2, 3出队列,子节点按照左左↔右右、左右↔右左的顺序入队列:[4, 7, 5, 6]
    • 然后4, 7出队列,子节点按照左左↔右右、左右↔右左的顺序入队列:[5, 6, 8, 15, 9, 14]
    • 然后5, 6出队列,子节点按照左左↔右右、左右↔右左的顺序入队列:[8, 15, 9, 14, 10, 13, 11, 12]
    • 然后剩下的子节点两两出队列。

    可以看到整个循环的过程子节点的遍历是从上到下,每层从两端向中间收拢的,我们按照这种方式遍历比较两两出队列的节点值就可判断出树是否对称。

    functionisSymmetric(root:TreeNode|null):boolean{// 空树默认为对称if(!root)returntrue;// 初始化队列,用于层序遍历对称位置的节点constqueue:Array<TreeNode|null>=[];// 根节点的左右子节点都为空,是对称树if(!root.left&&!root.right)returntrue;// 根节点的左右子节点只有一个为空,必然不对称if(!root.left||!root.right)returnfalse;// 将根节点的左右子节点(对称的起始节点)入队queue.push(root.left);queue.push(root.right);// 层序遍历队列中的对称节点对while(queue.length){// 每次取出队列前两个节点(一对对称节点)constleft=queue.shift()!;constright=queue.shift()!;// 两个节点都为空,说明当前对称位置无节点,继续检查下一对if(!left&&!right)continue;// 不对称的情况:// 1. 其中一个节点为空,另一个非空// 2. 两个节点值不相等if((!left||!right)||(left.val!==right.val))returnfalse;// 按对称规则将下一层节点入队:// 左节点的左子节点对应右节点的右子节点queue.push(left.left);queue.push(right.right);// 左节点的右子节点对应右节点的左子节点queue.push(left.right);queue.push(right.left);}// 所有对称节点对都验证通过,说明是对称二叉树returntrue;}

题目来源:力扣(LeetCode)

http://www.cnnetsun.cn/news/137356.html

相关文章:

  • 别被忽悠了!一文讲透MES管理系统本地部署与SaaS模式的真正底牌
  • 【毕业设计】基于springboot+微信小程序的羽球快讯爱好者平台小程序(源码+文档+远程调试,全bao定制等)
  • 小程序计算机毕设之基于SpringBoot的宠物领养微信小程序基于springboot+微信小程序的宠物领养系统小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于springboot+微信小程序的大学生餐厅点餐系统小程序基于springboot微信小程序的校园食堂订餐服务系统(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机小程序毕设实战-基于springboot+微信小程序的影院售票系统设计与实现基于SpringBoot的电影购票平台微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机小程序毕设实战-基于springboot+微信小程序的羽球快讯爱好者平台小程序羽毛球场预定app_羽毛球预约管家【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 11、文本与盒子属性的CSS技巧解析
  • 23、WinJS控件样式与样式规则定位指南
  • 27、Windows 8 应用开发中的 SVG 样式设计
  • SAP ABAP拆分交货单数量、批次、存储地点 并过账
  • 基于MPC的智能车运动预测和控制算法 Motion predication; Kinemati...
  • Mathcad的野路子】11kW PFC参数计算书实战拆解
  • STM32学习笔记CAN
  • 搭建你的第一个“私有知识库” (RAG)
  • 13、Unix 系统磁盘管理与安全定位脚本实用指南
  • 15、系统管理脚本实用指南
  • 怎么选一款适合大面积清洁的多功能全自动洗地机呢?
  • 使用matlab编写m脚本,编写无迹卡尔曼滤波算法(UKF)估计电池SOC,注释清晰
  • 教培行业新媒体运营困境凸显!这款软件或成转型制胜法宝?
  • Photoshop Neural Filters:把“引擎截图”秒变“电影级美宣”?AI 深度模糊与色彩迁移工作流
  • 基于matlab的多目标优化算法NSGA3,动态输出优化过程,得到最终的多目标优化结果。 数据...
  • 12.18
  • COCO 数据集
  • 国内好用的测试用例管理工具有哪些?
  • 24、COM+ 事务管理与补偿资源管理器详解
  • YOLO深度学习模型的训练参数配置与优化
  • 数字孪生可视化模板怎么用?5大行业Demo拆解,帮你快速复用提效
  • 必藏!程序员转型AI大模型:机遇、路径与成功率拆解
  • 《智构空间:AIOS 与全时域 3D 交互范式》第 0 篇:前言 —— 触摸语义的厚度
  • 如何将照片从 Android 传输到 Android