力扣面试150题--二叉树的层平均值

Day 54

题目描述

思路

初次做法(笨) :使用两个队列,一个队列存放树的节点,一个队列存放对应节点的高度,使用x存放上一个节点,highb存放上一个节点的高度,sum存放当前层的节点值之和,num存放当前层的节点数。

当出现x节点与队列顶部的节点高度不同时,说明遍历到该层的最后一个元素,计算平均值放入结果集res,清空sum和num。

当出现x节点与队列顶部的节点高度相同时。说明是一层的节点,更新sum和num。

以上是判断时做的,以下是判断完做的

将x指向队列顶部元素,highb指向队列顶部元素的高度,弹出两个队列顶部元素,将x的左右子树放入队列,直到队列为空。

java 复制代码
/**
 1. Definition for a binary tree node.
 2. public class TreeNode {
 3.     int val;
 4.     TreeNode left;
 5.     TreeNode right;
 6.     TreeNode() {}
 7.     TreeNode(int val) { this.val = val; }
 8.     TreeNode(int val, TreeNode left, TreeNode right) {
 9.         this.val = val;
 10.         this.left = left;
 11.         this.right = right;
 12.     }
 13. }
 */
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double>res=new ArrayList<Double>();
        if(root==null){
            return res;
        }
        Double sum=0.0;
        Double t=0.0;
        Queue<TreeNode>tree=new LinkedList<TreeNode>();
        Queue<Integer>high=new LinkedList<Integer>();
        tree.offer(root);
        high.offer(0);
        int highb=0;
        TreeNode x=root;
        int num=0;
        while(!tree.isEmpty()){
            if(highb==high.peek()){
                sum+=x.val;
                num++;
            }
            else{
                sum+=x.val;
                num++;
                res.add(sum/num);
                num=0;
                sum=0.0;
            }
            x=tree.poll();
            highb=high.poll();
            if(x.left!=null){
                tree.offer(x.left);
                high.offer(highb+1);
            }
            if(x.right!=null){
                tree.offer(x.right);
                high.offer(highb+1);
            }
        }
        sum+=x.val;
        num++;
        res.add(sum/num);
        return res;
    }
}

正确做法:不应该考虑高度的问题,原因在于我们在放入一层的元素后,该层元素的子树是在队列底部的,那么其实我们对于每层元素个数是清楚的,原因如下:

  1. 我们清楚第0层只有根节点一个元素,将它的左右子树(非空的)放入队列后,再取出队列顶部元素,队列中剩下的都是第1层的元素,此时用一个参数记录即可。
  2. 同理,我们第一层知道了元素个数,并且记录后,再将这一层的节点的子树放入队列,将这两个节点弹出,剩下的就是下一层的节点个数。
    因此有以下做法。
java 复制代码
// 思路:使用BFS
// 使用BFS,将每一层的数字加起来,然后求平均值
// 总结:时间复杂度O(N)  空间复杂度O(N)
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        //用于BFS的队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        //用于保存结果的数组
        List<Double> result = new ArrayList<>();

        double tempSum;//临时变量,记录每层节点相加的总和
        int tempCount;//临时变量,记录每层节点的个数
        TreeNode tempNode;//临时变量,方便BFS操作
        while (!queue.isEmpty()){
            //循环遍历每一层
            tempSum = 0.0;
            tempCount = queue.size();//记录当前层的元素个数
            for (int i = 0; i < tempCount; i++) {
                tempNode = queue.poll();
                if (tempNode.left != null) queue.offer(tempNode.left);
                if (tempNode.right != null) queue.offer(tempNode.right);

                tempSum += tempNode.val;//将每一层的节点值相加
            }
            result.add(tempSum / tempCount);//计算平均值,并加入结果集合中
        }

        //返回结果集合
        return result;
    }
}
相关推荐
学习论之费曼学习法7 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然7 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one7 小时前
算法--桶思想
java·开发语言·算法
飞猫的边缘AI8 小时前
MCU面试开放题
人工智能·mcu·面试·求职招聘·flash·ram·边缘ai
wordbaby8 小时前
同一次请求里的两道锁:图解搞懂国密 SM2 与 SM3
算法
CoderYanger8 小时前
Java EE 进阶:5. Spring IoC&DI(第一弹):Spring IoC
java·开发语言·spring boot·spring·面试·职场和发展·java-ee
miller-tsunami9 小时前
内存管理&模板
c++·算法·内存管理·模板
青少儿编程课堂9 小时前
蓝桥杯青少组·全国青少年信息素养·电子学会Scratch考级:校园智能抢答器项目解析
c++·python·算法·bfs·信息学竞赛
SZYSK9 小时前
一套人员主数据,三套事务:通行、消费、人证比对如何分事件类型
物联网·算法·harmonyos
怕浪猫10 小时前
不用摄像机,我把历史故事做成竖屏视频
算法·面试·github