【JS每日一算法】🟨97.二叉树的锯齿形层序遍历(广度优先+尾插法)

267 阅读1分钟

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

示例 1:

tree1.jpg

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[20,9],[15,7]]

示例 2:

输入: root = [1]
输出: [[1]]

题解: 更多JS版本题解点击链接关注该仓库👀个人博客

/**
 * @description: 广度优先  TC:O(n) SC:O(n)
 * @author: JunLiangWang
 * @param {*} root  给定树的头节点
 * @return {*}
 */
function bfs(root){
    
    /**
     * 该方案使用广度优先算法, 该题本质上还是树的层级遍历
     * 只不过需要定义一个变量,判断本层的节点是尾插法(从数组
     * 最后插入)插入数组还是头插法(从数组前面插入)插入数组
     * 
     * 广度优先算法依靠一个队列,先将根节点入队,然后循环
     * 不断将队列中的节点出队,然后将出队节点不为空的左右
     * 节点再次入队。如此往复直到队列为空
     * 
     */

    // 如果根为空,直接返回
    if(!root) return []
    
    // 队列
    const quene=[],
    // 输出数组
    out=[];
    // 方向 true:从左向右,即为尾插  false:从右向左即为头插
    let dir=true;
    // 将根节点入队
    quene.push(root)
    // 当队列不为空则继续遍历
    while(quene.length>0)
    {
        // 记录当前队列长度,也是本次层级的
        // 所有节点数量,由于出队会动态影响
        // 到队列的长度,因此此处记录,就可
        // 以知道本次层级的节点是否全部出队
        let size=quene.length
        // 添加本次层级的数组
        out.push([])
        // 遍历当前层级的所有节点
        while(size-->0){
            // 出队
            let node=quene.shift();

            // 判断方向,true:从左向右,即为尾插  
            //  false:从右向左即为头插
            if(dir)
            out[out.length-1].push(node.val);
            else
            out[out.length-1].unshift(node.val)
            // 将出队节点不为空的左右节点再次入队
            if(node.left)quene.push(node.left)
            if(node.right)quene.push(node.right)
        }
        // 翻转方向
        dir=!dir
    }
    // 返回结果
    return out
}