LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637_C++_简单)

LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637_C++_简单)

题目描述:

给定一个非空二叉树的根节点 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] 。

示例 2:

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

提示:

树中节点数量在 [1, 104] 范围内

-231 <= Node.val <= 231 - 1

题解:

解题思路:

思路一(BFS):

1、采用层次遍历的思想,计算每层结点值的总和结点个数 ,再计算每层的平均值。采用层次遍历的思想,当一层遍历完,队列中的元素为下一层的全部结点

2、复杂度分析:

① 时间复杂度:O(n),其中 n 是二叉树中的节点个数。遍历了一遍二叉树。

② 空间复杂度:O(n),其中 n 是二叉树中的节点个数。空间复杂度取决于队列开销,队列中的节点个数不会超过 n。

代码实现

代码实现(思路一(BFS)):
cpp 复制代码
class Solution{
public:
    vector<double> averageOfLevels(TreeNode *root){
        // 创建一个队列,用于进行广度优先遍历 (BFS)
        queue<TreeNode*> Q;
        // 将根节点加入队列
        Q.push(root);
        // 存储每一层的平均值
        vector<double> ans;
        
        // 当队列不为空时,继续遍历
        while (!Q.empty()){
            // 当前层的节点值总和
            double sum = 0;
            // 当前层的节点个数
            int size = Q.size();
            
            // 遍历当前层的所有节点
            for (int i = 0; i < size; i++){
                // 获取队列中的第一个节点
                TreeNode *node = Q.front();
                // 将该节点的值累加到 sum
                sum += node->val;
                // 弹出队列中的该节点
                Q.pop();

                // 如果当前节点有左子树,将左子树加入队列
                if (node->left != nullptr) Q.push(node->left);
                // 如果当前节点有右子树,将右子树加入队列
                if (node->right != nullptr) Q.push(node->right);
            }
            
            // 计算当前层的平均值,并将其加入结果数组
            ans.push_back(sum / size);
        }
        
        // 返回存储所有层平均值的数组
        return ans;
    }
};
以思路一为例进行调试
cpp 复制代码
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

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){}
};

TreeNode *createTree(vector<int> nums){
    if (nums.empty()){
        return nullptr;
    }
    TreeNode *root=new TreeNode(nums[0]);
    queue<TreeNode *> Q;
    Q.push(root);

    int i=1;
    while (i<nums.size()){
        TreeNode *node = Q.front();
        Q.pop();
        if (i<nums.size()&&nums[i]!=-1){
            node->left=new TreeNode(nums[i]);
            Q.push(node->left);
        }
        i++;

        if (i<nums.size()&&nums[i]!=-1){
            node->right=new TreeNode(nums[i]);
            Q.push(node->right);
        }
        i++;
    }
    return root;
}

class Solution{
public:
    vector<double> averageOfLevels(TreeNode *root){
        // 创建一个队列,用于进行广度优先遍历 (BFS)
        queue<TreeNode*> Q;
        // 将根节点加入队列
        Q.push(root);
        // 存储每一层的平均值
        vector<double> ans;
        
        // 当队列不为空时,继续遍历
        while (!Q.empty()){
            // 当前层的节点值总和
            double sum = 0;
            // 当前层的节点个数
            int size = Q.size();
            
            // 遍历当前层的所有节点
            for (int i = 0; i < size; i++){
                // 获取队列中的第一个节点
                TreeNode *node = Q.front();
                // 将该节点的值累加到 sum
                sum += node->val;
                // 弹出队列中的该节点
                Q.pop();

                // 如果当前节点有左子树,将左子树加入队列
                if (node->left != nullptr) Q.push(node->left);
                // 如果当前节点有右子树,将右子树加入队列
                if (node->right != nullptr) Q.push(node->right);
            }
            
            // 计算当前层的平均值,并将其加入结果数组
            ans.push_back(sum / size);
        }
        
        // 返回存储所有层平均值的数组
        return ans;
    }
};



int main(int argc, char const *argv[])
{

    vector<int> nums = {3,9,20,-1,-1,15,7};
    TreeNode *root= createTree(nums);
    Solution s;
    vector<double> ans= s.averageOfLevels(root);
    for(auto &i:ans){
        cout<<i<<" ";
    }
    return 0;
}

LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637)原题链接

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
wangjialelele2 分钟前
git工作原理、个人使用到多人协作开发与git FLOW模型
c语言·c++·git·团队开发·个人开发
iCxhust10 分钟前
__acrtused 是什么
c语言·c++·单片机·嵌入式硬件·微机原理
程序员zgh21 分钟前
CMake 项目构建工具介绍
c语言·开发语言·c++·编辑器
量子炒饭大师22 分钟前
一天一个计算机知识——【编程百度】向上取整
c语言·数据结构·c++·git·github
Dream it possible!27 分钟前
LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211_C++_中等)
c++·leetcode·面试·字典树
想用offer打牌40 分钟前
一站式了解http1.1,http2.0和http3.0
后端·网络协议·面试
dragoooon3442 分钟前
[C++——lesson26.「多态」]
java·c++·学习方法·多态
jun_不见1 小时前
面试官:你能说下订阅发布模式么,怎么在VUE项目中实现一个类似eventBus的事件总线呢
前端·javascript·面试
爱吃KFC的大肥羊1 小时前
Redis 基础完全指南:从全局命令到五大数据结构
java·开发语言·数据库·c++·redis·后端