BFS(Breadth First Search)广度优先算法
问题
LeetCode 102 二叉树层序遍历
分析
按层打印,如何换行就是首先要关心的问题。
根节点是明确的,同时根节点又是下一层的入口(通过 root.left / root.right 带出)。所以我们需要一个队列(queue)储存当前层所有的节点。每次换行,将上一层的节点推到结果数组中,并且通过递归收集当前层所有的节点,直到最后一层 - 队列为空。
换行的细节,将 queue 中的一个 node 出队,同时将这个 node 的左右节点入队。直到 queue 中上一层所有的节点全部出队完毕,此时下一层所有节点也全部入队啦。依次递归,直到 queue 为空。
节点为空为整个递归的结束条件。
实现
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */const levelOrder = (root) { if(!root) return []; // 起始状态 // 递归入口 const queue = [root]; let res = []; // 开始遍历队列 // 1. 循环终止条件为 queue.length while(queue.length) {// 2. 遍历 queue 时的终止条件用变量保存了一下// 这样做和不保存有什么区别// 如果和 1 处做个交换会怎么样const len = queue.length;for(let i=0; i < len; i++) { // 当前层(queue)的节点全部出队列 // 并把下一层的节点全部入队 const node = queue.shift(); curlevel.push(node.val); if(node.left) queue.push(node.left); if(node.right) queue.push(node.right); } res.push(curlevel); } return res; }复制代码
总结
BFS 中需要关注充当中间状态转换的队列(queue),以队列为突破口。关注换层的迭代过程。
同时思考下代码注释中 1 、2 处有什么不同呢?
「 一枚前端学习小透明,努力学习前端知识,同时分享自己对生活的一些思考,欢迎一起讨论交流。如果我的文章对你有帮助,请点个赞,会非常感恩你的鼓励。完」