本片文章主要事项介绍一下BFS(广度优先遍历),然后通过BFS解决一些题目。
框架思维很重要!!!
BFS代码框架
// 存储结构
// {val,left,right}
function bfs(root) {
// 当传入的是一棵空树的时候响应的操作
if (root == null) return 0;
const que = [];
while(que.length) {
let sz = que.length;
for(let i = 0; i < sz; ++i ) {
let cur = que.shift();
// 当前节点,在这里进行操作
if (cur.left !== null){
que.push(cur);
}
if (cur.right!==null) {
que.push(cur);
}
}
}
}
常见题目
-
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {number[]} */ var levelOrder = function(root) { if (root == null) return []; const que = [],result = []; que.push(root); while(que.length) { let size = que.length; for(let i = 0; i < size;++i) { let cur = que.shift(); result.push(cur.val); if (cur.left !== null ) que.push(cur.left); if (cur.right !== null) que.push(cur.right) } } return result; };
-
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number} */ var maxDepth = function(root) { if (root == null) return 0; const que = [],depthArray = []; que.push(root); let depth = 1; // 队列不空的时候 while (que.length !== 0) { let size = que.length; // 一层一层进行遍历的 for (let i = 0; i < size; ++i) { let cur = que.shift(); // // 碰到叶子节点 if (cur.left == null && cur.right == null) depthArray.push(depth); if (cur.left !== null) que.push(cur.left); if (cur.right !== null) que.push(cur.right); } // 遍历完一层之后深度增加1 depth++; } return Math.max.apply(Math,depthArray); };
-
在这里最小深度等价于碰到第一个叶子节点,因为最浅的那层叶子节点总是先被遍历到的。
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number} */ var minDepth = function(root) { if (root == null) return 0; const que = []; que.push(root); let depth = 1; // 队列不空的时候 while (que.length !== 0) { let size = que.length; // 一层一层进行遍历的 for (let i = 0; i < size; ++i) { let cur = que.shift(); // // 碰到叶子节点 if (cur.left == null && cur.right == null) return depth; if (cur.left !== null) que.push(cur.left); if (cur.right !== null) que.push(cur.right); } // 遍历完一层之后深度增加1 depth++; } return depth; };
总结:
从一个BFS框架可以看出,一旦掌握了类似的框架,你就可以解决一类的题目,只要你框架对了,剩下的就是细节处理了。解题时养成框架思维尤其重要。