题目:
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
抛砖引玉
从根节点开始遍历,遍历一个元素就将其从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(深度优先搜索)
思路
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
}