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

二叉树高频面试 2 道神题!递归 BFS 层序遍历 + 有序数组转平衡 BST,代码极简秒懂

一、102. 二叉树的层序遍历|递归 BFS,颠覆常规写法

大家印象中层序遍历都是用队列迭代,其实递归写法更简洁!核心思路:用层级标记节点位置,自动把每一层节点装进对应列表,不用队列也能完美实现「按层打印」,代码短到惊艳~

解题思路(超通俗)

  1. 核心逻辑:按层级遍历,把同一层的节点放在同一个列表里;
  2. 递归参数:传入当前节点 + 当前层级,标记节点属于哪一层;
  3. 终止条件:节点为空,直接返回(递归出口);
  4. 动态扩容:如果当前层级还没有对应的列表,就新建一个;
  5. 填充节点:把当前节点值放入对应层级的列表,再递归遍历左右子树。

最优代码(可直接复制提交)

/** * 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 List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode root) { // 从根节点、第0层开始递归 checkFun(root, 0); return result; } // 递归BFS:按层级将节点放入对应列表 public void checkFun(TreeNode node, Integer deep) { // 递归终止:空节点直接返回 if (node == null) return; // 当前节点层级+1 deep++; // 关键:层级不够,动态新建当前层的列表 if (result.size() < deep) { List<Integer> list = new ArrayList<>(); result.add(list); } // 把当前节点值放入对应层级的列表 result.get(deep - 1).add(node.val); // 递归遍历左、右子树 checkFun(node.left, deep); checkFun(node.right, deep); } }

亮点总结不用队列、不用复杂循环,纯递归实现层序遍历;自动按层分组,逻辑清晰好理解,面试写出来超亮眼!


二、108. 有序数组转平衡二叉搜索树|递归秒解

这道题是二叉搜索树 + 递归的经典送分题!要求转换后的树是高度平衡的(每个节点左右子树高度差不超过 1),核心思路一句话:取数组中间值当根节点,左边建左子树,右边建右子树,递归分治直接搞定!

解题思路(小白秒懂)

  1. 平衡关键:有序数组的中间元素就是根节点,天然保证左右子树平衡;
  2. 分治思想:把数组拆分成左半部分(左子树)、右半部分(右子树);
  3. 递归终止:左指针 > 右指针,说明没有元素,返回 null;
  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 sortedArrayToBST(int[] nums) { // 初始化左右指针,覆盖整个数组 int left = 0; int right = nums.length - 1; return travel(nums, left, right); } // 递归构建平衡BST public TreeNode travel(int[] nums, int left, int right) { // 终止条件:左指针超过右指针,无节点可建 if (left > right) return null; // 取中间位置作为根节点(保证平衡) int mid = (left + right) / 2; TreeNode root = new TreeNode(nums[mid]); // 递归构建左子树(数组左半部分) root.left = travel(nums, left, mid - 1); // 递归构建右子树(数组右半部分) root.right = travel(nums, mid + 1, right); return root; } }

亮点总结严格满足高度平衡要求,不用手动调整树结构;纯递归分治,代码短短 6 行核心逻辑,面试必背模板!


最后总结

这两道题是二叉树递归思想的绝佳练手题:✅ 102 题:学会递归实现层序遍历,打破「层序必用队列」的固定思维;✅ 108 题:掌握分治 + 中间值法,轻松构建平衡二叉搜索树;

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

相关文章:

  • 突破百度网盘限速:面向资源获取者的高效直链解析方案
  • Pixel Epic智识终端用户体验报告:200+科研人员真实反馈与改进建议
  • 救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳
  • Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作
  • 【Agents】自定义子代理进阶:后台执行
  • 大数据在电力行业应用案例解析 -【电力技术】(25)RPA 在电力业扩报装中的自动化应用与实现
  • 图纸加密方法有哪些?分享3种图纸加密的方法,保护图纸安全
  • 路由器、交换机、光猫有什么区别?网络设备基础入门
  • 音频驱动面部动画:Audio2Face技术原理与实践指南
  • 3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO智能脚本使用指南
  • 快马平台快速生成git安装配置交互教程,零基础也能轻松上手
  • Windows前端开发提速:用Bun一键替换Yarn/Npm,加速Vue与React项目构建
  • 【立煌】友达10.1寸G101STN01.C工业液晶屏LCD
  • 嵌入式开发实用代码片段与调试技巧
  • Stable Yogi Leather-Dress-Collection 批量生成与任务队列管理方案
  • Python内存监控体系搭建:Prometheus+Custom Metrics+内存火焰图,实现OOM前15分钟精准预警
  • AI赋能.NET开发:让快马平台智能生成Redis缓存与消息队列集成代码
  • 独立站页面结构优化的注意事项是什么_独立站 SEO 与品牌建设的关系是什么
  • ESP32 Wi-Fi配网实战:AP+Web双模轻量级方案
  • Python大麦网智能抢票脚本:三分钟搭建你的自动购票系统
  • Python智能内存管理策略深度评测(CPython 3.9–3.12全版本横评):谁真正降低了47.6% OOM风险?
  • 效率提升:用快马快速构建排序算法性能对比工具,科学选型
  • 深度解析WindowResizer:Windows窗口强制调整工具的技术架构与实现
  • baidu-wangpan-parse:突破百度网盘限速的直链解析解决方案
  • Whisper-WebUI 语音转写实战指南:从环境配置到模型优化的6个关键突破
  • 飞书设置服务器异常消息
  • DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱
  • intv_ai_mk11商业应用:营销文案润色、会议纪要提炼、邮件草稿生成案例
  • isaac lab5.0与ROS2通信
  • 阿里云无痕验证后台配置全解析:从测试参数trans到正式上线避坑