题目描述:
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例1:
输入:
3
/
9 20
/
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
提示:
节点值的范围在32位有符号整数范围内。
代码:
/**
* 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> v;
if(root==nullptr)return v;
queue<TreeNode*> q;
vector<TreeNode*> child_v;
q.push(root);
while(true){
double layernum=0;
int n=0;
while(!q.empty()){
TreeNode* thisnode = q.front();
layernum+=thisnode->val;
n++;
q.pop();
if(thisnode->left!=nullptr)child_v.push_back(thisnode->left);
if(thisnode->right!=nullptr)child_v.push_back(thisnode->right);
}
v.push_back(layernum/n);
if(child_v.size()==0)break;
if(q.size()==0){
for(int i=0;i<child_v.size();i++)q.push(child_v[i]);
child_v.clear();
}
}
return v;
}
};
二叉树的层遍历。
用一个队列存放当前层的所有节点 queue<TreeNode> q
用一个数组存放当前层的下一层的所有节点 vector<TreeNode> child_v**
vector< double > v存放各层节点和的均值
首先判断根节点root是否为空,为空直接返回;否则创建队列和数组,并初始化把root当作第一层的节点,加入队列中:q.push(root)
对当前队列,依次取出节点元素,处理该节点,把该节点的左右孩子节点加入child_v;累计节点值之和和节点个数,算出该层的值,加入v中记录;
当处理完队列中所有节点,队列为空,说明该计算和处理下一层的节点了。**判断child_v是否为空,若为空,说明没有层要处理了,结束,返回结果;**若child_v不为空,依次把child_v中的节点放入队列,并把child_v清空以便记录下一层节点。