【leetcode】637.二叉树的层平均值

49 阅读1分钟

leetcode-637.png

题目简述:二叉树层次遍历,计算每一层的平均数。
思路:这一题直接套用BFS的框架即可,DFS也能行,只不过就是不太直观

BFS

var averageOfLevels = function (root) {
    let res = []
    if (!root) return res
    let queue = [root]
    while (queue.length) {
        let size = queue.length
        let levelSum = 0
        for (let i = 0; i < size; ++i) {
            let node = queue.shift()
            // 当前层次的数字累加
            levelSum += node.val
            if (node.left) queue.push(node.left)
            if (node.right) queue.push(node.right)
        }
        // 计算平均数,并放入 res 中
        res.push(levelSum / size)
    }
    return res
};

DFS

也是常规的DFS层次遍历思路,先拿到层次遍历的结果,然后拿结果去计算平均值
只不过这里的平均值的计算不优雅

var averageOfLevels = function (root) {
    let res = []
    if (!root) return res
    var dfs = function (node, level) {
        if (!node) return
        if (res.length === level) {
            res.push([])
        }
        res[level].push(node.val)
        dfs(node.left, level + 1)
        dfs(node.right, level + 1)
    }
    dfs(root, 0)
    let ave = []
    for (let level of res) {
        let sum = 0
        for (let i of level) {
            sum += i
        }
        ave.push(sum / level.length)
    }
    return ave
};

使用reduce来计算,这里就要好好的了解下reduce的用法了

var averageOfLevels = function (root) {
    const res = [];
    if (!root) return res;

    // 深度优先搜索 (DFS)
    const dfs = function (node, level) {
        if (!node) return;
        if (res.length === level) {
            res.push([]);
        }
        res[level].push(node.val);
        dfs(node.left, level + 1);
        dfs(node.right, level + 1);
    }

    dfs(root, 0);

    // 计算每一层的平均值
    return res.map(level => {
        const sum = level.reduce((acc, val) => acc + val, 0);
        return sum / level.length;
    });
}