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

二叉树面试送分题|力扣101对称+226翻转(递归极简写法,手写无压力)

兄弟们!二叉树面试中,有两道“送分题”必须拿捏——力扣101.对称二叉树和力扣226.翻转二叉树。这两道题难度不高,核心都能用递归轻松解决,代码简洁、逻辑直观,新手练一遍就能记住,面试手写直接加分,今天就手把手拆解,带你吃透递归思路,再也不用怕这类题目!

一、力扣101. 对称二叉树(递归判断,逻辑直观无冗余)

对称二叉树说白了就是判断一棵二叉树是否关于根节点对称,比如“镜像”一样。很多新手会纠结怎么对比节点,其实用递归两两对比对应位置的节点,思路超简单,几行代码就能搞定,而且边界条件考虑周全,面试写这个写法,面试官都得夸你思路清晰!

解题思路(递归核心)

核心逻辑:判断“左子树的左孩子 == 右子树的右孩子,左子树的右孩子 == 右子树的左孩子”,用递归层层对比,直到所有节点都对比完成。

一步步拆解,小白也能看懂:

1. 特殊判断:根节点为null时,空树是对称的,直接返回true(这里纠正一个小细节,原代码中返回false是错误的,空树符合对称条件哦);

2. 递归核心:定义一个对比方法,同时传入两个节点(左子树的节点和右子树的对应节点),两两对比;

3. 终止条件:① 两个节点都为null → 对称,返回true;② 一个为null、一个不为null → 不对称,返回false;③ 两个节点值不相等 → 不对称,返回false;

4. 递归推进:对比左子树的左孩子和右子树的右孩子(外层对称),再对比左子树的右孩子和右子树的左孩子(内层对称),只有两者都对称,整体才对称。

优化后代码(注释清晰,可直接复制提交)

/** * Definition for a binary tree node. * public 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; // 修正:空树是对称的,返回true return compare(root.left, root.right); // 递归对比左子树和右子树 } // 核心对比方法:判断两个节点是否对称(对应位置节点) public boolean compare(TreeNode left, TreeNode right){ // 排除节点为空的情况,先处理边界 if(left != null && right == null) return false; else if(left == null && right != null) return false; else if(left == null && right == null) return true; // 排除节点值不相等的情况 else if(left.val != right.val) return false; // 递归对比:外层(左左 vs 右右)、内层(左右 vs 右左) boolean outside = compare(left.left, right.right); boolean inside = compare(left.right, right.left); boolean isSame = outside && inside; // 两者都对称,才是整体对称 return isSame; } }

✨亮点拉满!递归逻辑贴合对称场景,把对比逻辑封装成独立方法,层次清晰,边界条件考虑周全(空节点、值不相等全覆盖)。代码无冗余,面试手写时,不用多余思考,顺着递归思路写,3分钟就能搞定,新手也能零失误!

二、力扣226. 翻转二叉树(前序递归,3行核心,小白秒会)

翻转二叉树又称“镜像二叉树”,是面试高频送分题,核心需求就是交换每一个节点的左右孩子。用前序递归写法最直观,先处理当前节点,再递归处理左右子树,代码短到离谱,逻辑简单到不用动脑子,练一遍就能记住!

解题思路(前序递归)

采用前序遍历(中→左→右)的思路,自上而下完成翻转,核心就3步,超简单:

1. 终止条件:节点为null(空树无需翻转,直接返回null);

2. 处理当前节点(中):交换当前节点的左右孩子,这是翻转的核心操作;

3. 递归推进:分别递归翻转当前节点的左子树和右子树,自上而下完成整个树的翻转;

4. 递归回溯,返回翻转后的根节点,搞定!

优化后代码(注释清晰,可直接复制提交)

/** * Definition for a binary tree node. * public 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 TreeNode invertTree(TreeNode root) { // 利用前序递归解决,思路:中→左→右 if(root == null) return null; // 终止条件:空节点无需翻转 swapChildren(root); // 先处理当前节点(中),交换左右孩子 invertTree(root.left); // 递归翻转左子树(左) invertTree(root.right); // 递归翻转右子树(右) return root; } // 封装交换节点左右孩子的方法,代码更简洁、可读性更高 public void swapChildren(TreeNode node){ if(node == null) return; // 空节点无需交换 TreeNode temp = node.left; node.left = node.right; node.right = temp; } }

亮点暴击!前序递归完美贴合翻转场景,先交换再递归,逻辑连贯不绕弯。把交换操作封装成独立方法,代码更简洁,可读性拉满。核心逻辑就3行,新手秒懂,面试手写时,不用多余修饰,直接写,高效又加分!

总结

1. 力扣101(对称二叉树):递归对比对应节点,边界条件拉满,逻辑直观,面试手写无压力;

2. 力扣226(翻转二叉树):前序递归+交换孩子,3行核心代码,小白秒会,效率拉满。

建议大家动手敲一遍代码,理解递归的终止条件和推进逻辑,搞定这两道题,二叉树递归类基础面试题就稳了,后续遇到复杂题目也能快速找到思路~

http://www.jsqmd.com/news/563200/

相关文章:

  • 告别臃肿SDK!手把手教你用PyQt5+奥比中光SDK精简版,5分钟搞定深度相机实时显示
  • 别再瞎设50Ω了!HFSS/CST仿真中S参数端口阻抗到底怎么设?手把手教你避坑
  • 深度学习实战:从零构建验证码识别模型
  • 避坑指南:解决Ubuntu 22.04 + ROS Humble下MAVROS编译失败的几个常见问题
  • CH1115 OLED驱动库:内存优化多屏共享与硬件动画实现
  • ComfyUI更新后报错不断?手把手教你排查GPU显存与节点缺失问题(附4090实测)
  • UPS后备时间怎么算?一文读懂核心公式逻辑
  • 《string 专项 训练(进阶)习题》
  • 5分钟掌握CT肺部分割:lungmask深度学习实战完整指南
  • 用Multisim和74LS系列芯片复刻经典交通灯:一个电子课程设计的完整复盘与避坑指南
  • 如何彻底解决iPhone过热降频问题?thermalmonitordDisabler完整指南
  • 主成分分析十年演进
  • 如何用ES-ImageNet数据集训练你的第一个脉冲神经网络(SNN)模型?
  • 零基础部署Qwen3.5推理蒸馏模型:Web界面一键开启结构化分析体验
  • 技术职业发展困境与突破方案
  • ARM单片机中断机制与Cortex-M3优化解析
  • 避坑指南:SpringBoot异步流式推送中你绝对遇到的5个性能陷阱
  • 2026净水口碑推荐:净水OEM/净水器/净水机/厨下净水/台式净水/台式制冰机/宁波净水生产/氢水/浙江净水生产/选择指南 - 优质品牌商家
  • 告别ISO失败!用Ventoy制作万能Win10安装U盘玩转VMware
  • 3步搞定百度网盘高速下载:Python直链解析工具完整指南
  • 封装map和set所需第二步:红黑树
  • 3步掌握SillyTavern:从零构建AI角色对话系统的终极指南
  • Suspense 异步组件与懒加载实战
  • 实测STM32L053待机功耗65uA,手把手教你配置唤醒引脚(附完整代码)
  • 解决打印机标签尺寸匹配问题
  • C++并发编程实战:std::atomic的exchange与compare_exchange操作到底怎么选?
  • GStreamer 核心组件解析:Element 的创建、连接与 Pipeline 构建实战
  • Windows下利用Rclone实现多协议云存储盘符映射实战指南
  • 如何为Umi-OCR选择最适合的离线文字识别插件?
  • 3 分钟速算!UPS后备时间简易估算方法