题目:
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例:
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
提示:
- 节点值的范围在32位有符号整数范围内。
抛砖引玉
广度优先搜索(BFS)
从根节点开始遍历,遍历一个元素就将其从queue中取出,将其下一层放入queue中待下次遍历
每一层遍历均记录子元素的和,且求平均值(该地方好像有个隐患,求平均值未设置保留整数或者多少小数位,可能会有js的精度问题)到结果数组中
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var averageOfLevels = function(root) {
let _result = [],
queue = [];
if (root == null) return [];
queue.push(root);
while (queue.length) {
let len = queue.length,
levelSum = 0;
for (let i = 0; i < len; i++) {
let node = queue.shift();
levelSum = levelSum+node.val;
if (node.left) {
queue.push(node.left);
}
if (node.right) {
queue.push(node.right);
}
}
_result.push(levelSum/len);
}
return _result;
};
因为本题要求层的平均值,刚好广度优先搜索的逻辑也是一层层搜索,所以BFS一定是最先想到的,
回看day-04: 二叉树的所有路径 (难度:简单),会想起来遍历二叉树除了BFS还有DFS,那么下面尝试下DFS(深度优先搜索)
深度优先搜索(DFS)
思路
- 在每层递归时记录当前处理的层数
- 遇到相同层数的节点累加到同层中,统计累计个数+1
- 最终按层计算平均值
var binaryTreePaths = function (root) {
let _result = [],
map = new Map() // 记录个数
function dfs(node, level) {
if (!node) return
map.set(level,(map.get(level) || 0) + 1)
_result[level] = (_result[level] || 0) + node.val
dfs(node.left, level+1)
dfs(node.right, level+1)
}
dfs(root, 0);
// 求平均值
for(let i =0;i<_result.length;i++){
_result[i] = _result[i]/map.get(i)
}
return _result
}
博客: 小书童博客
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目
欢迎关注留言