637. Average of Levels in Binary Tree
题干简述:
给我们一个二叉树的根节点,求解该二叉树每层节点的平均值。
每层节点的平均值平均值 = 每层节点和 / 每层节点数
解题思路
首先,我们可以提取出题干的关键词“每层”,这就给我们解题的思路了。二叉树,层,映入脑海的自然是 BFS 广度优先遍历了。
BFS 的实现原理很简单,通过一个数组来维护一个队列,由于队列的 FIFO(先入先出)特性,在每个节点出队的时候,我们可以将其子节点入队,这样,当这一层节点全部出队的时候,它下一层的所有节点此时都已经入队了。这一题,要求我们就算每层节点的平均值,要计算平均值,我们需要得到两个值,当前层所有节点和,与当前层所有节点数目。重点,就在于如何获取到当前层。
结合例子,我们可以发现,当前层的节点数目,可以通过上一层处理完成后的数组长度得知,借此,我们可以判断当前层是否处理完成,并进行有关的计算。
题解
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var averageOfLevels = function(root) {
if (!root) return [];
const queue = [root];
const res = [];
while (queue.length) {
const len = queue.length;
let sum = 0;
for (let i = 0;i < len;i++) {
const node = queue.shift();
sum += node.val;
node.left && queue.push(node.left);
node.right && queue.push(node.right);
}
res.push(sum / len);
}
return res;
};
BFS 能解决的题目,大多也可以通过 DFS(深度优先遍历)解决,当然,会繁琐很多。DFS 解法需要维护两个数组,sums 用于维护每一层的节点和,count 用于维护每一层的节点数。相较于普通的DFS递归函数,我们这里额外需要一个参数 level,用于辅助判断当前节点属于哪一层,并借此决定操作 sums 和 count 数组中的哪一项。
题解如下:
var averageOfLevels = function(root) {
const sums = [];
const count = [];
const dfs = (node, level) => {
if (!node) return;
const len = sums.length;
if (level < len) {
sums[level] += node.val;
count[level] += 1;
} else {
sums[level] = node.val
count[level] = 1;
}
dfs(node.left, level + 1);
dfs(node.right, level + 1);
}
dfs(root, 0);
const res = [];
for (let i = 0;i < sums.length;i++) {
res.push(sums[i] / count[i]);
}
return res;
};
Q.E.D.