题目简述:二叉树层次遍历,计算每一层的平均数。
思路:这一题直接套用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;
});
}