【稳固知新】'二叉树的层平均值' 广度优先遍历BFS&&深度优先遍历DFS

208 阅读3分钟

题目描述

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



示例 1:

输入:
    3
   / \
  9  20
    /  \
   15   7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 ,  第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。


提示:

节点值的范围在32位有符号整数范围内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

way1:层序遍历BFS typescript

代码

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function averageOfLevels(root: TreeNode | null): number[] {
    let result:number[]=[];
    if(root==null){
        return result;
    }
    // 利用队列queue进行层序遍历 
    let  queue=[root];

    while(queue.length>0){

        let levelNum:number=queue.length;
        let count:number=queue.length;
        let sum:number=0;
        while(levelNum--){
         let  top:any=queue.shift();
          sum+=top.val;
          if(top.left!==null){
              queue.push(top.left);
          }
          if(top.right!==null){
              queue.push(top.right);
          }

        }
        // 当层序遍历完成,计算平均值,并将平均值压入数组;
        let average=sum/count;
        result.push(average);

    }
    return result;
};

way2:广度优先遍历 DFS javascript

  • 使用map来记录每层节点个数;
  • 使用_result来记录每一层节点的总和;
  • 初始调用dfs(root,0),
  • 退出递归条件为node==null
  • 递归遍历左子树dfs(root.left,level+1)和右子树dfs(root.right,level+1)
  • 遍历计算每一层的平均值;
var averageOfLevels = 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

};