LeetCode题解No637——“二叉树的层平均值”

LeetCode题解

No637

难度:Easy

题目描述:

/*
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。


示例 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广度优先遍历,这道题也是这样,对于每一层用一个临时的size储存本层的一个长度,根据这个size去从队列中把本层的节点出队,随后用一个sum去维护本层的节点值的和,等该层遍历完之后,将sum/size添加到list中,遍历结束返回list即可

代码执行

public class No637 {
   class TreeNode{
       int val;
       TreeNode left;
       TreeNode right;
       TreeNode(int x){
           val = x;
       }
   }
   public List<Double> averageOfLevels(TreeNode root) {
       List<Double> list = new ArrayList<Double>();
       // 特判
       if (root == null){
           return list;
       }
       // 对其进行层序遍历
       Queue<TreeNode> queue = new ArrayDeque<>();
       queue.offer(root);
       // 如果不为空的时候进行循环
       while(!queue.isEmpty()){
           // 每层的一个宽度
           int size = queue.size();
           // 用于保存每层的节点的值的和
           double ans = 0;
           for (int i = 0; i < size; i++) {
               // 出队
               TreeNode cur = queue.poll();
               ans+=cur.val;
               // 如果当前出队的节点左子树不为空,加入队列中
               if (cur.left != null){
                   queue.offer(cur.left);
               }
               // 如果当前出队的节点右子树不为空,加入队列中
               if (cur.right != null){
                   queue.offer(cur.right);
               }
           }
           double cur_ans = ans/size;
           list.add(cur_ans);
       }
       return list;
   }
}

纠错

1:第一次跑测试的时候,把代码中的ans值设定成了int类型,导致结果出现29/2 = 14的情况,改成double类型后解决

执行结果

原文地址:https://www.cnblogs.com/mlz031702145/p/13656069.html