一天一大 lee(二叉树的层平均值)难度:简单-Day20200912

时间:2022-07-25
本文章向大家介绍一天一大 lee(二叉树的层平均值)难度:简单-Day20200912,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目:

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

示例:

输入:
    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
}