01、二叉树的层平均值

厨子大约 3 分钟数据结构算法算法基地面试二叉树层序遍历刷题程序厨校招社招

哈喽,大家好,我是厨子,今天给大家分享一道题目

https://leetcode.cn/problems/average-of-levels-in-binary-tree/?envType=problem-list-v2&envId=binary-treeopen in new window

题目描述

给定一个非空二叉树的根节点 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]。
        3
       / \
      9  20
        /  \
       15   7

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]
        3
       / \
      9  20
     / \
    15  7

约束条件:

  • 树中节点数量在 [1, 10^4] 范围内
  • -2^31 <= Node.val <= 2^31 - 1

解题思路

这道题是典型的二叉树层序遍历问题,需要按层遍历树,并计算每层的平均值。

核心思想

层序遍历(BFS):
- 使用队列存储每一层的节点
- 逐层处理,计算每层节点的平均值

只要是会二叉树的层序遍历,这个题目完全没有任何问题

图解示例

以示例1为例:[3,9,20,null,null,15,7]

        3              层0: [3]           平均值 = 3/1 = 3.0
       / \
      9  20            层1: [9, 20]       平均值 = (9+20)/2 = 14.5
        /  \
       15   7          层2: [15, 7]       平均值 = (15+7)/2 = 11.0

这个题目比较简单,我们直接看代码就好

代码实现

BFS(队列)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        vector<double> result;
        if (root == nullptr) {
            return result;
        }

        queue<TreeNode*> q;
        q.push(root);

        while (!q.empty()) {
            // 当前层的节点数,提前计算
            int levelSize = q.size();
            double sum = 0;

            // 遍历当前层的所有节点
            for (int i = 0; i < levelSize; i++) {
                TreeNode* node = q.front();
                q.pop();

                // 累加当前层的节点值
                sum += node->val;

                // 将下一层的节点加入队列
                if (node->left) {
                    q.push(node->left);
                }
                if (node->right) {
                    q.push(node->right);
                }
            }

            // 计算当前层的平均值
            result.push_back(sum / levelSize);
        }

        return result;
    }
};

时间复杂度: O(n),n 是节点总数,每个节点访问一次

空间复杂度: O(w),w 是树的最大宽度(队列最多存储一层的节点)