2025年--Lc165--H637.二叉树的层平均值(二叉树的层序遍历)--Java版
1.题目
2.思路
(1)广度优先搜索计算二叉树的层平均值。从根节点开始搜索,每一轮遍历同一层的全部节点,计算该层的节点数以及该层的节点值之和,然后计算该层的平均值。
(2)层次遍历,广度优先搜索用队列存储待访问节点,只要确保在每一轮遍历时,队列中的节点是同一层的全部节点。
1)初始时,将根节点加入队列;
2)每一轮遍历,将队列中的节点全部取出,计算这些节点的数量以及它们的节点值之和,并计算这些节点的平均值,
然后将这些节点的全部非空子节点加入队列,重复上述操作直到队列为空,遍历结束。
3)初始时队列中只有根节点,满足队列中的节点是同一层的全部节点,每一轮遍历时都会将队列中的当前层节点全部取出,并将下一层的全部节点加入队列,因此可以确保每一轮遍历的是同一层的全部节点。
3.代码实现
/*** 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;}
}