二叉树层序遍历的三种情况(总结)

news/2025/2/23 1:50:29/

这道题就是一个比较简单的层序遍历,只需要利用队列存放二叉树结点,队列的size代表每层的节点数也就是平均值的除数,利用一个结果数组记录每层平均值,最后返回。

需要注意的是,平均值定义成double类型。

代码如下:

class Solution {public List<Double> averageOfLevels(TreeNode root) {// 结果数组List<Double> results = new ArrayList<>();if (root == null) {return results;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {// 当前层节点数量int LevelSize = queue.size();// 当前节点值的总和double levelSum = 0;// 遍历当前层所有节点for (int i = 0; i < LevelSize; i++) {// 从队列中取出一个节点TreeNode node = queue.poll();levelSum += node.val;if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}double average = levelSum / LevelSize;results.add(average);}return results;}
}

这道题其实就是简单的二叉树层序遍历,只不过把每层的节点遍历单独拿了出来,那么其实很简单。创建一个嵌套列表List<List<Integer>> res = new ArrayList<List<Integer>>(),每层的结果用一维列表存储,最后把每层结果存进嵌套列表输出即可。

代码如下:

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res=new ArrayList<List<Integer>>();if(root==null){return res;}Queue<TreeNode>queue=new LinkedList<TreeNode>();queue.offer(root);while(!queue.isEmpty()){List<Integer>level=new ArrayList<Integer>();int currentSize=queue.size();for(int i=1;i<=currentSize;++i){TreeNode node=queue.poll();level.add(node.val);if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}res.add(level);}return res;}}

这道题就用到了一种平常不怎么常用的数据结构,双端队列,利用一个bool 变量来表示该层是从左往后还是从右往左

  • 如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。

  • 如果从右至左,我们每次将被遍历到的元素插入至双端队列的头部。

代码如下:
 

class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>>ans=new LinkedList<List<Integer>>();if(root==null){return ans;}Queue<TreeNode>nodequeue=new ArrayDeque<TreeNode>();//双端队列nodequeue.offer(root);boolean isOrderLeft=true;while(!nodequeue.isEmpty()){Deque<Integer> levelList=new LinkedList<Integer>();int size=nodequeue.size();for(int i=0;i<size;i++){TreeNode curNode=nodequeue.poll();if(isOrderLeft){levelList.offerLast(curNode.val);}else{levelList.offerFirst(curNode.val);}if(curNode.left!=null){nodequeue.offer(curNode.left);}if(curNode.right!=null){nodequeue.offer(curNode.right);}}ans.add(new LinkedList<Integer>(levelList));isOrderLeft=!isOrderLeft;}return ans;}
}


http://www.ppmy.cn/news/1574295.html

相关文章

一周学会Flask3 Python Web开发-flask3模块化blueprint配置

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候&#xff0c;多多少少会划分几个或者几十个业务模块&#xff0c;如果把这些模块的视图方法都写在app.py…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

如何取消Word首字母自动大写?

在英语语法中&#xff0c; 当英文单词位于句子开头时&#xff0c; 首字母要大写。 因此&#xff0c;为了输入方便&#xff0c; 我们常用的Word会默认 英文首字母大写。 但平时我们在输入中文的语境下&#xff0c; 偶尔加几个英语单词并不需要如此。 那么 如何取消Word…

【HeadFirst系列之HeadFirst设计模式】第8天之适配器模式与外观模式:让不兼容的接口和谐共处!

适配器模式与外观模式&#xff1a;让不兼容的接口和谐共处&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的适配器模式&#xff08;Adapter Pattern&#xff09;和外观模式&#xff08;Facade Pattern&#xff09;。如果你曾经遇到过接口不兼容的问题&#xff0c;或…

【登月计划】 DAY2 中期:产品研发与设计验证(4-6)--《设计图纸如何从电脑飞进生产线?揭秘研发系统的 “暗箱操作”》

目录 四、乐高教学&#xff1a;拆解 CAD/CAE 与 PLM 的 “共生关系” 1. CAD 系统&#xff1a;工程师的 “数字画笔” &#x1f3a8; 2. CAE 系统&#xff1a;产品的 “虚拟实验室” &#x1f52c; 3. PLM 系统&#xff1a;设计的 “大管家” 五、装逼话术&#xff1a;设计…

Lineageos 22.1(Android 15)Launcer打开Taskbar

一、前言 Taskbar是Android高版本给大屏幕设备定制的快捷导航条&#xff0c;屏幕宽度或者高度达到一定程度&#xff0c;就会判断为平板而显示taskbar。 /*** Returns {code true} if the bounds represent a tablet.*/public boolean isTablet(WindowBounds bounds) {return s…

使用 Docker-compose 部署 MySQL

使用 Docker Compose 部署 MySQL 本文将详细指导如何使用 docker-compose 部署 MySQL&#xff0c;包括基本配置、启动步骤、数据持久化以及一些高级选项。通过容器化部署 MySQL&#xff0c;你可以快速搭建一个隔离的数据库环境&#xff0c;适用于开发、测试或小型生产场景。 关…

Linux相关命令

Linux相关知识 1.名词介绍2.Linux 文件基本属性1.Linux文件属主和属组2.更改文件属性1.chgrp&#xff1a;更改文件属组2.chown&#xff1a;更改文件所有者&#xff08;owner&#xff09;&#xff0c;也可以同时更改文件所属组。3.chmod&#xff1a;更改文件9个属性 3. Linux 文…