【JS每日一算法:剑指Offer系列】🟨172.二叉树的右视图(广度优先)

95 阅读1分钟

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

 

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

 

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 广度优先  TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} root
 * @return {*}
 */                 
function bfs(root){
    /**
     * 本方案采用广度优先遍历树的节点,然后记录树的每层
     * 最后一个节点即可
     * 
     * 广度优先算法依靠一个队列,先将根节点入队,然后循环
     * 不断将队列中的节点出队,然后将出队节点不为空的左右
     * 节点再次入队。如此往复直到队列为空
     */
    
    // 如果根为空,直接返回
    if(!root)return [];
    // 队列,将根节点入队
    let queue=[root],
    // 输出数组
    out=[]
    // 当队列不为空则继续遍历
    while(queue.length){
        // 记录当前队列长度,也是本次层级的
        // 所有节点数量,由于出队会动态影响
        // 到队列的长度,因此此处记录,就可
        // 以知道本次层级的节点是否全部出队
        let size=queue.length,
        // 记录最后一个节点
        node=null
        while(size--){
            // 出队
            node=queue.shift()
            // 将出队节点不为空的左右节点再次入队
            if(node.left)queue.push(node.left)
            if(node.right)queue.push(node.right)
        }
        // 记录最后一个节点值
        out.push(node.val)
    }
    // 返回结果
    return out
}