力扣面试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;
    }
}
相关推荐
武子康30 分钟前
大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART
大数据·人工智能·算法·机器学习·语言模型·spark-ml·剪枝
无处不在的海贼1 小时前
小明的Java面试奇遇之:支付平台高并发交易系统设计与优化[特殊字符]
java·开发语言·面试
江城开朗的豌豆1 小时前
JavaScript篇:构造函数 vs Class:谁才是对象创建的王者?
前端·javascript·面试
江城开朗的豌豆1 小时前
JavaScript篇:数组找不同:如何快速找出两个数组间的'单身狗'元素?
前端·javascript·面试
爱coding的橙子2 小时前
每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h
算法·leetcode·职场和发展
地平线开发者3 小时前
征程 6EM 常见 QConfig 配置解读与示例
算法·自动驾驶
用户0595661192093 小时前
Java 面试资料中相关代码使用方法及组件封装方法解析
面试
帅夫帅夫3 小时前
四道有意思的考题
前端·javascript·面试
GEEK零零七4 小时前
Leetcode 1908. Nim 游戏 II
算法·leetcode·博弈论
sbc-study4 小时前
混沌映射(Chaotic Map)
开发语言·人工智能·python·算法