题目链接:点击查看
题目描述:
给定一个二叉树,求每一层的节点值的平均数。
输入输出:
输入: 3 / \ 9 20 / \ 15 7 输出:[3, 14.5, 11]
题目分析:
我们可以使用广度优先搜索进行层次遍历。从根节点开始搜索,每一轮遍历同一层的全部节点,计算该层的节点数以及该层的节点值之和,然后计算该层的平均值。具体实现方法为,初始时,将根节点加入队列。每一轮遍历时,将队列中的节点全部取出,计算这些节点的数量以及它们的节点值之和,并计算这些节点的平均值,然后将这些节点的全部非空子节点加入队列,重复上述操作直到队列为空,遍历结束。详见如下代码。
代码:
vector<double>averageOfLevels(TreeNode*root)
{
vector<double>ans;
if(!root)
{
return ans;
}
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
int count=q.size();//每一轮遍历之前获得队列中的节点数量 ,遍历时只遍历 size 个节点,即可满足每一轮遍历的是同一层的全部节点。
double sum=0;
for(int i=0;i<count;++i)//每一轮遍历时都会将队列中的当前层节点全部取出,并将下一层的全部节点加入队列
{
TreeNode *node=q.front();
q.pop();
sum+=node->val;
if(node->left)
{
q.push(node->left);
}
if(node->right)
{
q.push(node->right);
}
}
ans.push_back(sum/count);
}
return ans;
}