其他分享
首页 > 其他分享> > 【LeetCode】第637题——二叉树的层平均值(难度:简单)

【LeetCode】第637题——二叉树的层平均值(难度:简单)

作者:互联网

【LeetCode】第637题——二叉树的层平均值(难度:简单)

题目描述

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

  1. 示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

由于是每层求平均值,因此使用BFS会更加符合计算顺序。

就是对二叉树进行简单的BFS,依旧利用队列Queue来存储每层的节点,只不过需要额外记录每层的节点数。

另外题目有一个小缺陷,由于是要算平均值,便有两种算法,一种是(a1+…+an)/n,这种算法更精确,但是(a1+…+an)在累加过程中容易超出界限(而本题就是少了这个前提,本题应该默认每层求累加和的过程中不会有数值越界的情况发生);另一种是a1/n+…+an/n,这种算法不会导致数值越界,但是容易产生累计误差,本题的有一个算例便是由于累计误差而导致不通过。

代码详解

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> list = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        // 经典的BFS代码块
        queue.offer(root);
        double sum = 0;
        while(!queue.isEmpty()) {
            double node_count = queue.size();	// 用于记录每层节点个数
            double count = node_count;			// 用于记录当前循环应该出队多少个节点,才能让本层节点全部出队,使得在下一次循环中队列中只保留下一层的全部节点
            while(count != 0) {					// 共出队count个节点
                TreeNode node = queue.poll();
                // 注意下方的代码保证了队列里不会有null元素
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
                --count;
                sum += node.val;	// 累加和,这里有个小隐患在“解题思路”里提到了
            }
            list.add(sum / node_count);	// 求平均并放入list中
            sum = 0;	// 清空累加器
        }
        return list;
    }
}

注意点

  1. 本题的小bug就是在求累加和的过程中会有数值越界的可能,应该在提示里明确一下。
  2. 两种求平均值方法的优缺点在“解题思路”里有描述。

标签:node,count,TreeNode,637,每层,节点,queue,二叉树,LeetCode
来源: https://blog.csdn.net/qq_43536930/article/details/114037132