使用BFS框架AC多道题

本片文章主要事项介绍一下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);
        }
      }
    }
}

常见题目

  1. 二叉树层次遍历

    /**
     * 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;
    };
    
  2. 求二叉树最大深度

    /**
     * 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);
    };
    
  3. 求二叉树最小深度

    在这里最小深度等价于碰到第一个叶子节点,因为最浅的那层叶子节点总是先被遍历到的。

    /**
     * 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框架可以看出,一旦掌握了类似的框架,你就可以解决一类的题目,只要你框架对了,剩下的就是细节处理了。解题时养成框架思维尤其重要。

慢慢来,比较快!基础要牢,根基要稳!向大佬致敬!
原文地址:https://www.cnblogs.com/rookie123/p/14653801.html