news 2026/6/7 13:23:04

二叉树的层序遍历——AI 教会我的 BFS 面试必杀技

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树的层序遍历——AI 教会我的 BFS 面试必杀技

读完本文你将了解:二叉树层序遍历的两种写法 | BFS 队列模板的通用性 | 如何从一道题延伸到社交图谱遍历


📋 题目

原题:给你二叉树的根节点root,返回其节点值的层序遍历结果(即逐层地,从左到右访问所有节点)。

项目说明
输入root = [3,9,20,null,null,15,7]
输出[[3],[9,20],[15,7]]
约束节点数 0~2000,-1000 ≤ Node.val ≤ 1000
3 / \ 9 20 / \ 15 7

💡 先问一个问题

猜猜 AI 第一次写二叉树的层序遍历,它会怎么写?

大多数人(包括 AI)的第一反应是递归——因为平时写二叉树问题,90% 都是递归。但层序遍历偏偏是个异类:它天然适合迭代,不适合递归。

为什么呢?因为层序遍历需要"按层"输出,递归的调用栈天然是按深度走的,不是按层。


🤖 第一版:AI 的朴素尝试(用 DFS 硬做)

# AI 的第一反应:递归 + 层级参数deflevelOrder(root):result=[]defdfs(node,level):ifnotnode:returniflen(result)==level:result.append([])result[level].append(node.val)dfs(node.left,level+1)dfs(node.right,level+1)dfs(root,0)returnresult

AI 为什么会这样写?因为"带层级的递归"是大多数人能想到的最直观方案——用level参数标记当前深度,每层建一个数组。不能说它错,但面试官期待的不是这个。

复杂度:时间 O(n) 空间 O(h)(h = 树高,最坏 O(n))

3 (level=0)

9 (level=1)

20 (level=1)

15 (level=2)

7 (level=2)


🧠 AI 的自我优化:队列才是正解

当我告诉 AI "面试官希望看到 BFS + 队列实现"后,AI 立刻给出了面试官真正想要的版本:

# AI 优化版:BFS + 队列fromcollectionsimportdequedeflevelOrder(root):ifnotroot:return[]result=[]queue=deque([root])whilequeue:level_size=len(queue)level=[]for_inrange(level_size):node=queue.popleft()level.append(node.val)ifnode.left:queue.append(node.left)ifnode.right:queue.append(node.right)result.append(level)returnresult

关键技巧:level_size = len(queue)——每次循环开始时记录当前队列长度,这个长度恰好就是当前层的节点数。处理完这个数量的节点,就进入下一层。

Result队列Result队列初始: [3]入队 9,20 → [9,20]入队 15,7 → [15,7]result=[[3],[9,20],[15,7]]出队 3 → level=[3]出队 9 → level=[9]出队 20 → level=[9,20]出队 15 → level=[15]出队 7 → level=[15,7]

复杂度:时间 O(n) 空间 O(w)(w = 最大层宽,最坏 n/2)


☕ Java 实现

classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>result=newArrayList<>();if(root==null)returnresult;Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){intlevelSize=queue.size();List<Integer>level=newArrayList<>();for(inti=0;i<levelSize;i++){TreeNodenode=queue.poll();level.add(node.val);if(node.left!=null)queue.offer(node.left);if(node.right!=null)queue.offer(node.right);}result.add(level);}returnresult;}}

🎯 产品场景:朋友圈好友推荐

假设你正在开发一个社交 App,想让用户看到"可能认识的人"——分类为"一级好友"(直接好友)、“二级好友”(好友的好友)、“三级好友”。

这就是一个典型的 BFS 层序遍历问题:

deffriend_recommendations(graph,user,max_level=3):"""按亲密度推荐好友"""visited={user}queue=deque([user])level=0whilequeueandlevel<max_level:level_size=len(queue)level+=1print(f"=== 第{level}级好友 ===")for_inrange(level_size):current=queue.popleft()forneighboringraph[current]:ifneighbornotinvisited:visited.add(neighbor)queue.append(neighbor)print(f" 推荐:{neighbor}(第{level}度)")

同样逻辑可以套用到:文件系统目录层级展示、网络拓扑发现、知识图谱关联搜索。


📝 面试考点

考点说明
队列数据结构面试官看你是否知道用 Queue 还是 Stack
分层技巧levelSize = queue.size()是核心考点
变体应对自底向上层序、锯齿形层序、N 叉树层序
时空分析O(n) 时间 O(w) 空间,能说出 max width = n/2

高频变体题(面试常考):

  • LeetCode 107:自底向上层序遍历(最后reverse即可)
  • LeetCode 103:锯齿形层序遍历(加个 flag 控制左右方向)
  • LeetCode 429:N 叉树的层序遍历(把 left/right 换成 children)

参考资料

[1] LeetCode 102. Binary Tree Level Order Traversal: https://leetcode.com/problems/binary-tree-level-order-traversal/
[2] LeetCode 107. Binary Tree Level Order Traversal II: https://leetcode.com/problems/binary-tree-level-order-traversal-ii/
[3] LeetCode 103. Binary Tree Zigzag Level Order Traversal: https://leetcode.com/problems/binary-tree-level-order-traversal-zigzag/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 13:19:53

解决Genymotion启动失败:VirtualBox Host-Only网络配置详解

1. 从一次恼人的启动失败说起&#xff1a;Genymotion与VirtualBox的“握手”之谜作为一名常年混迹在嵌入式、物联网和移动应用开发一线的工程师&#xff0c;我打交道最多的除了各种硬件板卡&#xff0c;就是形形色色的开发环境和模拟器。最近在为一个智能家居中控APP做跨平台兼…

作者头像 李华
网站建设 2026/6/7 13:19:51

Visdom本地可视化服务源码包,含PyTorch训练监控演示与前端构建脚本

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;一套开箱即用的Visdom完整源码&#xff0c;支持在本地快速启动可视化服务&#xff0c;实时展示深度学习训练过程中的指标曲线、图像样本、文本日志和高维特征嵌入。前端基于JavaScript开发&#xff0c;包含Imag…

作者头像 李华
网站建设 2026/6/7 13:18:28

STM32调试效率提升:RAM与Flash调试模式详解与实战配置

1. 项目概述&#xff1a;为什么要在RAM和Flash中调试STM32&#xff1f;对于很多刚接触STM32开发的工程师来说&#xff0c;调试似乎就是简单地点击Keil MDK里的“Download”和“Debug”按钮。然而&#xff0c;当项目变得复杂&#xff0c;或者需要频繁修改代码进行测试时&#xf…

作者头像 李华
网站建设 2026/6/7 13:18:28

IAR Embedded Workbench深色主题配置指南:基于VS Code Dark+的护眼方案

1. 项目概述&#xff1a;从“亮瞎眼”到“护眼黑”的IAR主题改造之旅作为一名长期奋战在嵌入式开发一线的工程师&#xff0c;我深知一个舒适的编码环境对效率和健康有多重要。最近几个月&#xff0c;项目密集&#xff0c;每天盯着IAR Embedded Workbench那默认的亮白色主题写代…

作者头像 李华
网站建设 2026/6/7 13:16:15

华强北背包客生存指南:揭秘数码产品供应链末梢的真实生态

1. 华强北背包客&#xff1a;一场被流量神话的“淘金热”最近刷资讯&#xff0c;总能看到一些关于“深圳华强北背包客年入百万”的传奇故事&#xff0c;说得有鼻子有眼&#xff0c;仿佛只要背个包去华强北转一圈&#xff0c;财富密码就到手了。作为一个在华强北周边电子圈摸爬滚…

作者头像 李华
网站建设 2026/6/7 13:15:02

3步掌握AssetStudio:新手快速提取Unity游戏资源的终极指南

3步掌握AssetStudio&#xff1a;新手快速提取Unity游戏资源的终极指南 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and additio…

作者头像 李华