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

devtools/2025/2/23 10:29:53/

这道题就是一个比较简单的层序遍历,只需要利用队列存放二叉树结点,队列的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/devtools/161159.html

相关文章

独立开发者如何寻找产品设计灵感

作为独立开发者&#xff0c;面对激烈的市场竞争和不断变化的用户需求&#xff0c;寻找优秀的产品设计灵感是至关重要的一步。以下是一篇关于独立开发者如何寻找产品设计灵感的教程&#xff0c;希望能为你提供一些有益的指导。 一、观察日常生活 1.1 关注身边的小问题 在日常生…

【网络】DHCP(Dynamic Host Configuration Protocol)

DHCP 解释与比喻&#xff1a; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09; 是一种自动分配 IP 地址和其他网络配置信息的协议。你可以把它想象成“网络中的自动派发信件”。 比喻&#xff1a; 假设你是一名新来的学生&#xff0c;进入一个学校&#x…

CountDownlatch实现原理

文章目录 类图及概要核心方法await() 方法await(long timeout, TimeUnit unit) 方法countDown() 方法getCount() 方法 总结 类图及概要 CountDownLatch 内部有个计数器&#xff0c;并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器&#xff0c;在何…

高级运维:1. 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。2. 基于 openEuler 构建 LVS-DR 群集。

1. LVS 负载均衡群集的 NAT 模式和 DR 模式的对比 特性NAT 模式DR 模式配置复杂度配置简单&#xff0c;适合初学者和小型网络环境配置相对复杂&#xff0c;需要配置虚拟 IP 和 ARP 抑制性能性能瓶颈可能出现在负载均衡器&#xff0c;不适合高流量场景高性能&#xff0c;响应速…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind&#xff1a;凭证类型 Username with password&#xff1a; 配置 用…

Ops 详解:从 DevOps 到 SecOps,探索网络安全与运维的核心概念

在 IT 和网络安全领域&#xff0c;“Ops” 这个词被频繁提及&#xff0c;它是 Operations&#xff08;运营 / 操作&#xff09; 的缩写&#xff0c;在不同的技术方向中&#xff0c;代表着 开发、运维、安全、云计算、网络管理 等多种角色和实践。从 DevOps&#xff08;开发运维…

51单片机介绍

1、单片机基础知识 1.1、单板机 将CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备(小键盘、LED显示器)等装配到一块印刷电路板上,再配上监控程序(固化在ROM中),就构成了一台单板微型计算机(简称单板机)。 1.2、单片机 在一片集成电路芯片上集成微处理器、存储器…

0222-leetcode-1768.交替合并字符串、389找不同、

1768.交替合并字符串 题目 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&#xff1a; 输入&…