1.题目
2.思路
(1)广度优先搜索计算二叉树的层平均值。从根节点开始搜索,每一轮遍历同一层的全部节点,计算该层的节点数以及该层的节点值之和,然后计算该层的平均值。
(2)层次遍历,广度优先搜索用队列存储待访问节点,只要确保在每一轮遍历时,队列中的节点是同一层的全部节点。
1)初始时,将根节点加入队列;
2)每一轮遍历,将队列中的节点全部取出,计算这些节点的数量以及它们的节点值之和,并计算这些节点的平均值,
然后将这些节点的全部非空子节点加入队列,重复上述操作直到队列为空,遍历结束。
3)初始时队列中只有根节点,满足队列中的节点是同一层的全部节点,每一轮遍历时都会将队列中的当前层节点全部取出,并将下一层的全部节点加入队列,因此可以确保每一轮遍历的是同一层的全部节点。
3.代码实现
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
//列表存储平均数
List<Double> avg=new ArrayList<Double>();
//链表存储每次入队列的节点
Queue<TreeNode> que=new LinkedList<TreeNode>();
//先将根节点入队
que.offer(root);
//如果队列不为空
while(!que.isEmpty())
{ //局部变量:sum是每层的总和,也是变化的
double sum=0;
//局部变量:size是根据当前层的节点个数变化的
int size=que.size();
for(int i=0;i<size;i++)
{
//将队列的元素弹出
TreeNode node=que.poll();
//本层元素加和
sum=sum+node.val;
//遍历本层元素的孩子节点,包括左节点和右节点
TreeNode left=node.left;
TreeNode right=node.right;
if(left!=null)
{ //如果左孩子节点不为空,入队
que.offer(left);
}
if(right!=null)
{//如果右孩子节点不为空,入队
que.offer(right);
}
}
//计算每层的平均数
avg.add(sum/size);
}
return avg;
}
}