【JS每日一算法:剑指Offer系列】🟩173.二叉树的层平均值(广度优先)

57 阅读2分钟

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^(-5) 以内的答案可以被接受。

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [3.00000,14.50000,11.00000]
解释: 第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11]

示例 2:

输入: root = [3,9,20,15,7]
输出: [3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -231 <= Node.val <= 231 - 1

题解:

个人博客

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

/**
 * @description: 广度优先  TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} root 给定树的根节点
 * @return {*}
 */
function bfs(root){
    /**
     * 该方案使用广度优先遍历数组节点,然后计算每层节点
     * 的平均值,并记录
     * 
     * 广度优先算法依靠一个队列,先将根节点入队,然后循环
     * 不断将队列中的节点出队,然后将出队节点不为空的左右
     * 节点再次入队。如此往复直到队列为空
     * 
     */

    // 如果根为空,直接返回
    if(!root)return []
    // 队列,将根节点入队
    let quene=[root],
    // 输出数组
    out=[]
    // 当队列不为空则继续遍历
    while(quene.length){
        // 记录当前队列长度,也是本次层级的
        // 所有节点数量,由于出队会动态影响
        // 到队列的长度,因此此处记录,就可
        // 以知道本次层级的节点是否全部出队
        let divisor=count=quene.length,
        // 记录本层节点值总和
        sum=0
        // 遍历当前层级的所有节点
        while(count--){
            // 出队
            let node=quene.shift()
            // 加上当前节点值
            sum+=node.val
            // 将出队节点不为空的左右节点再次入队
            if(node.left)quene.push(node.left)
            if(node.right)quene.push(node.right)
        }
        out.push(sum/divisor)
    }
    // 返回结果
    return out
}