【二叉树】Leetcode 637. 二叉树的层平均值【简单】

二叉树的层平均值

  • 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:


输入 :root = [3,9,20,null,null,15,7]
输出 :[3.00000,14.50000,11.00000]
解释 :第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。

因此返回 [3, 14.5, 11] 。

解题思路

广度优先搜索 (BFS)

  • 使用队列来实现BFS,从根节点开始,逐层遍历二叉树。

逐层处理

  • 在遍历每一层时,记录当前层的节点数量,计算当前层节点值的总和,然后计算平均值。

存储结果

  • 将每层的平均值存储在一个列表中,最终返回这个列表。

Java实现

java 复制代码
public class AverageOfLevels {
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> result = new ArrayList<>();
        if (root == null) {
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            double sum = 0;
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                sum += node.val;
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            result.add(sum / levelSize);
        }

        return result;
    }

    public static void main(String[] args) {
        AverageOfLevels averageOfLevels = new AverageOfLevels();

        // 构建示例二叉树
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(9);
        root.right = new TreeNode(20);
        root.right.left = new TreeNode(15);
        root.right.right = new TreeNode(7);

        // 计算每层的平均值
        List<Double> result = averageOfLevels.averageOfLevels(root);
        System.out.println("Average of levels: " + result);  // 输出: [3.0, 14.5, 11.0]
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点仅被访问一次。
  • 空间复杂度:O(m),其中 m 是二叉树中最宽的一层的节点数。在最坏情况下,队列中会存储最多一层的所有节点。
相关推荐
做科研的周师兄29 分钟前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
Sunsets_Red43 分钟前
差分操作正确性证明
java·c语言·c++·python·算法·c#
【杨(_> <_)】1 小时前
SAR信号处理重要工具-傅里叶变换(二)
算法·信号处理·傅里叶分析·菲涅尔函数
怎么没有名字注册了啊1 小时前
爬动的蠕虫
算法
取酒鱼食--【余九】1 小时前
机器人学基础(一)【坐标系和位姿变换】
笔记·算法·机器人·开源·机器人运动学·机器人学基础
晨非辰2 小时前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试
im_AMBER2 小时前
数据结构 03 栈和队列
数据结构·学习·算法
凸头2 小时前
以AtomicInteger为例的Atomic 类的底层CAS细节理解
java·jvm·算法
前端小刘哥3 小时前
赋能在线教育与企业培训:视频直播点播平台EasyDSS视频点播的核心技术与应用实践
算法
吗~喽3 小时前
【LeetCode】四数之和
算法·leetcode·职场和发展