二叉树的层序遍历

server/2024/11/18 11:57:09/

一、题目

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,null,null,15,7},
在这里插入图片描述
该二叉树层序遍历的结果是
[[3],[9,20],[15,7]]

二、解决方案

2.0 树节点构造

 public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;}

2.1 直接逐层遍历,定义nextNodeList和curLevelList,每遍历一层,就将当前层节点curList添加到结果res中。

// 定义nextNodeList和curLevelList,每遍历一层,就将当前层节点curList添加到结果res中public List<List<Integer>> levelOrderOne(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root == null){return null;}// 存储当前层的节点List<TreeNode> curList = new ArrayList<>();curList.add(root);// 每遍历一层,就将当前层节点curList添加到结果res中while(!curList.isEmpty()){List<TreeNode> nextNodeList = new ArrayList<>();List<Integer> curLevelList = new ArrayList<>();for(TreeNode node : curList){curLevelList.add(node.val);if(node.left != null){nextNodeList.add(node.left);}if(node.right != null){nextNodeList.add(node.right);}}res.add(curLevelList);curList = nextNodeList;}return res;}

2.2 利用队列实现

因为队列是先进先出的数据结构,如果从左到右访问完一行节点,并在访问的时候把它们的子节点依次加入到队列,这时候它们的子节点也是按照顺序来进行的。且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。

    /*** 建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。* 每次进入一层,统计队列的元素个数,因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。* 每次遍历这一层这么多的节点数,将其依次从队列中弹出,然后加入这一行的一维数组中,如果它们有子节点,依次加入队列排队等待访问。* 访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。*/public List<List<Integer>> levelOrderTwo(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root == null){return null;}Queue<TreeNode> queue = new ArrayDeque<>();queue.add(root);while(!queue.isEmpty()){// 记录二叉树的某一行List<Integer> currentRow = new ArrayList();int currentQueueSize = queue.size();for (int i = 0; i < currentQueueSize; i++) {// 先存当前根节点TreeNode node = queue.poll();currentRow.add(node.val);// 若是左右孩子存在,则存入左右孩子作为下一个层次if(node.left!= null){queue.add(node.left);}if(node.right!=null){queue.add(node.right);}}res.add(currentRow);}return res;}

http://www.ppmy.cn/server/142903.html

相关文章

前端 易混淆知识点梳理

目录 一、严格模式与非严格模式 二、双等于三等的区别 三、防抖和节流 四、原型和原型链 五、页面重绘和回流 六、script标签async和defer 七、普通函数和箭头函数的区别 八、JS闭包 1、闭包特点 2、闭包作用 3、闭包风险 4、运用场景 1&#xff09;常见闭包 2&a…

引入了JUnit框架 却报错找不到:java.lang.ClassNotFoundException

完整报错如下&#xff1a; Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID junit-jupiter failed to discover tests at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrc…

NotePad++中安装XML Tools插件

一、概述 作为开发人员&#xff0c;日常开发中大部的数据是标准的json格式&#xff0c;但是对于一些古老的应用&#xff0c;例如webservice接口&#xff0c;由于其响应结果是xml&#xff0c;那么我们拿到xml格式的数据后&#xff0c;常常会对其进行格式化&#xff0c;以便阅读。…

Cloudflare代理后的https连接的建立还是从源客户端到服务器端握手协商的连接吗

在 Cloudflare 代理的 HTTPS 连接中&#xff0c;连接的建立过程涉及多个步骤&#xff0c;具体如下&#xff1a; 客户端与 Cloudflare 的连接 初始连接&#xff1a;当客户端发起 HTTPS 请求时&#xff0c;它首先与 Cloudflare 的边缘服务器建立连接。这个连接会进行 TLS 握手&a…

docker 安装nacos

docker 安装开发环境配置 nacos安装 docker拉取镜像 docker pull nacos/nacos-server:1.2.0创建容器 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0

#Swift Automatic Initializer Inheritance

在Swift中&#xff0c;**自动初始化器继承&#xff08;Automatic Initializer Inheritance&#xff09;**是一种机制&#xff0c;用于简化类的初始化器继承规则。它决定了在什么条件下子类可以自动继承父类的初始化器&#xff0c;而无需手动实现或重写。自动继承初始化器的机制…

23 种设计模式详解

设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、 组合模…

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…