二叉树面试送分题|力扣101对称+226翻转(递归极简写法,手写无压力)
兄弟们二叉树面试中有两道“送分题”必须拿捏——力扣101.对称二叉树和力扣226.翻转二叉树。这两道题难度不高核心都能用递归轻松解决代码简洁、逻辑直观新手练一遍就能记住面试手写直接加分今天就手把手拆解带你吃透递归思路再也不用怕这类题目一、力扣101. 对称二叉树递归判断逻辑直观无冗余对称二叉树说白了就是判断一棵二叉树是否关于根节点对称比如“镜像”一样。很多新手会纠结怎么对比节点其实用递归两两对比对应位置的节点思路超简单几行代码就能搞定而且边界条件考虑周全面试写这个写法面试官都得夸你思路清晰解题思路递归核心核心逻辑判断“左子树的左孩子 右子树的右孩子左子树的右孩子 右子树的左孩子”用递归层层对比直到所有节点都对比完成。一步步拆解小白也能看懂1. 特殊判断根节点为null时空树是对称的直接返回true这里纠正一个小细节原代码中返回false是错误的空树符合对称条件哦2. 递归核心定义一个对比方法同时传入两个节点左子树的节点和右子树的对应节点两两对比3. 终止条件① 两个节点都为null → 对称返回true② 一个为null、一个不为null → 不对称返回false③ 两个节点值不相等 → 不对称返回false4. 递归推进对比左子树的左孩子和右子树的右孩子外层对称再对比左子树的右孩子和右子树的左孩子内层对称只有两者都对称整体才对称。优化后代码注释清晰可直接复制提交/** * 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空树无需翻转直接返回null2. 处理当前节点中交换当前节点的左右孩子这是翻转的核心操作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.coloradmin.cn/o/2467072.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!