题目描述
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 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的解题套路模板去直接扫描所有结点。
一层一层的去扫描,扫描完当前层,把当前结点的值都加起来,并且计算出平均值,存入我们的数组中,然后继续扫描下一层,直至结束。
代码
/**
* 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> res; //res用于记录结果
queue<TreeNode*> q; //用于存放结点的队列
if(root==NULL){//如果当前树为空
return res;//直接返回空数组
}
q.push(root);//将根节点入队
while(!q.empty()){//当队列非空时
int sz1=q.size();//记录当前一层的数量
int sz2=sz1;//sz2用于记录当前一层的数量,因为sz1后面需要--,所以sz2可以固定当前层
double ave=0;//用于计算和
while(sz1>0){//扫描当前层
TreeNode* p=q.front();//取结点
ave+=p->val;//加入和中
q.pop();//出队
sz1--;当前层的结点-1
if(p->left!=NULL){//当前结点的左孩子非空时
q.push(p->left);//左孩子入队
}
if(p->right!=NULL){//当前结点的右孩子非空时
q.push(p->right);//右孩子入队
}
}
double temp=ave/sz2;//计算当前层的平均值
res.push_back(temp);//将这个值加入数组
}
return res;
}
};