【二叉树 Java】二叉树的层序遍历

article/2025/9/18 19:47:24

一、层序遍历定义:

按照每层进行遍历,从左至右,从上至下遍历树的节点,如下图所示

在这里插入图片描述

二、题目描述:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

三、层序遍历解决思路:

我们之前在进行前序、中序与后序遍历的迭代写法中,都是用栈模拟的,但是层序遍历不一样,是用队列进行模拟的。

问题一: 为什么是队列,我们可以思考一下,对每层元素先进入的元素先被遍历到,比如上题的第三层元素 5 先进入,元素 5 也需要先被遍历到。而队列恰好就是一种先进先出的数据结构,因此用队列进行处理。

在这里插入图片描述

问题二:通过上面的分析,我们知道了可以用队列模拟二叉树的层序遍历, 那么接下来问题就来到了,我们如何记录遍历到第几层了尼,即如何确定单层遍历结束?

对这个问题,我们可以思考每次循环我们向队列中应该加入那些节点,每次循环向队列中加入的节点应该为上一层的所有节点的孩子节点按从左向右的顺序加入。因此,我们只需要记录上一层节点个数,即上一次循环结束队列的长度 size。在进行当次循环时,只需要依此遍历 size 个队列中的节点元素就可以结束了,对遍历到的每个节点元素,将其出队列,然后将其左右子节点加入队列中。遍历 size 次后当前层就完全遍历完毕,被加入到队列中。于此同时,当前层的上一层的所有节点也被从队列出移除。

四、代码:

    // 二叉树的层序遍历public List<List<Integer>> levelOrder(TreeNode root) {// 存储结果的数组List<List<Integer>> res = new ArrayList<>();if(root == null){return res;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){List<Integer> level = new ArrayList<>();int size = queue.size();for(int i=0; i<size; 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(new ArrayList<>(level));}return res;}

五、层序遍历的应用

求二叉树的深度

求二叉树的深度,就是在二叉树层序遍历的基础上,在每一层遍历结束的时候将深度变量加1

    //最大深度public int maxDepth(TreeNode root) {int maxD = 0;if(root == null){return maxD;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size = queue.size();for(int i=0; i<size; i++){TreeNode treeNode = queue.poll();if(treeNode.left != null) queue.offer(treeNode.left);if(treeNode.right != null) queue.offer(treeNode.right);}maxD++; // 增加深度}return maxD;}

http://chatgpt.dhexx.cn/article/0JbDAuIY.shtml

相关文章

二叉树----层序遍历

1.层序遍历 层序遍历:层序遍历即逐层按顺序遍历二叉树的各个节点,故层序遍历又叫广度优先遍历. 如图:广度优先遍历即按ABCDEFGH的顺序遍历 2.解题思路 1.这里我们利用队列先进先出的结构特点,当我们在队列中弹出一个树的节点时,我们便把树的左孩子和右孩子入到队列之中.(如果父…

二叉树的层序遍历

二叉树的层序遍历 1.层序遍历2.实例2.1二叉树的层序遍历2.2 二叉树的层序遍历 II2.3 二叉树的右视图2.4 二叉树的层平均值2.5 N叉树的层序遍历2.6在每个树行中找最大值2.7二叉树的最大深度2.8二叉树的最小深度2.9翻转二叉树2.10完全二叉树的节点个数2.11左叶子之和2.11找树左下…

二叉树的遍历——层序遍历

一、之前写了二叉树的三种遍历方法&#xff1a;有先序遍历、中序遍历、后序遍历&#xff0c;这三种方法都是用递归的方式来遍历二叉树的。层序遍历则不是使用递归来遍历&#xff0c;而是使用队列的来实现遍历&#xff1a; void LevelTreeOrder(BTNode* root) {Queue q;QueueIni…

【机器学习】LDA算法 (主题模型算法)

随着互联网的发展&#xff0c;文本分析越来越受到重视。由于文本格式的复杂性&#xff0c;人们往往很难直接利用文本进行分析。因此一些将文本数值化的方法就出现了。LDA就是其中一种很NB的方法。 LDA有着很完美的理论支撑&#xff0c;而且有着维度小等一系列优点。本文对LDA算…

LDA算法和PCA算法的总结(原理和思想)

LDA和PCA的对比(并没有公式推导&#xff0c;改日会写) 先补一补数学(不需要)&#xff1a; 方差——概率论和统计方差衡量随机变量或一组数据时离散程度的度量&#xff1b;概率论中方差用来度量随机变量和其数学期望之间的偏离程度。统计中的方差&#xff08;样本方差&#xff…

LDA算法原理及LDA与PCA的比较

1. LDA算法简介 LDA&#xff08;线性判别式分析 Linear Discriminant Analysis&#xff09;属于机器学习中的监督学习算法&#xff0c;常用来做特征提取、数据降维和任务分类。在人脸识别、人脸检测等领域发挥重要作用。LDA算法与PCA算法都是常用的降维技术。二者的区别在于&a…

LDA算法调研报告

LDA算法调研报告 1、LDA算法概述 本文所阐述的LDA算法全称为Latent Dirichlet Allocation&#xff08;网上没有标准的中文名称&#xff0c;我称之为潜在狄利克雷分配算法&#xff09;&#xff0c;不是线性判别分析算法&#xff08;Linear Discriminant Analysis&#xff09;。L…

【机器学习】LDA算法原理

问题 线性判别分析(Linear Discriminant Analysis,LDA)是机器学习中常用的降维方法之一,本文旨在介绍LDA算法的思想,其数学推导过程可能会稍作简化。 LDA的思想 ● LDA是一种线性的、有监督的降维方法,即每个样本都有对应的类别标签(这点和PCA不同)。 ● 主要思想:…

Spark机器学习-LDA算法09

LDA算法 LDA即文档主题生成模型,该算法是一种无监督学习 将主题对应聚类中心,文档作为样本,则LDA也是一种聚类算法 该算法用来将多个文档划分为K个主题,与Kmeans类似 LDA是一种基于概率统计的生成算法 LDA算法—种常用的主题模型,可以对文档主题进行聚类,同样也可以用…

LDA算法实现鸢尾花数据集降维

目录 1. 作者介绍2. LDA降维算法2.1 基本概念2.2 算法流程 3. LDA算法实现3.1 数据集介绍3.2 代码实现3.3 结果展示 1. 作者介绍 唐杰&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…

秒懂---LDA算法

线性判别分析LDA原理总结 在主成分分析&#xff08;PCA&#xff09;原理总结中&#xff0c;我们对降维算法PCA做了总结。这里我们就对另外一种经典的降维方法线性判别分析&#xff08;Linear Discriminant Analysis, 以下简称LDA&#xff09;做一个总结。LDA在模式识别领域&…

基于Sklearn实现LDA算法

文章目录 一、LDA算法二、sklearn实现LDA三、结果如图四、总结五、参考 一、LDA算法 1.线性判别分析&#xff08;Linear Discriminant Analysis, LDA&#xff09;方法常被用于数据预处理中的降维&#xff08;dimensionality reduction&#xff09;步骤。LDA在保证良好的类别区…

LDA算法推导

LDA算法是什么 简单地说LDA算法就是向低维度投影&#xff0c;让同一类别数据投影点更接近&#xff0c;不同类别数据点距离更远。 LDA原理 定义&#xff0c;已知 我们要把两类数据都投影到w直线上。 让不同类别的数据的类别中心之间的距离尽可能的大&#xff0c; 同一种类别数…

线性判别分析LDA原理总结

转自http://www.cnblogs.com/pinard/p/6244265.html 在主成分分析&#xff08;PCA&#xff09;原理总结中&#xff0c;我们对降维算法PCA做了总结。这里我们就对另外一种经典的降维方法线性判别分析&#xff08;Linear Discriminant Analysis, 以下简称LDA&#xff09;做一个总…

线性判别分析(Linear Discriminant Analysis, LDA)算法分析

LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的。性鉴别分析的基本思想是将高维的模式样本投影到…

机器学习笔记17-LDA算法

1. LDA算法简介 LDA&#xff08;线性判别式分析 Linear Discriminant Analysis&#xff09;属于机器学习中的监督学习算法&#xff0c;常用来做特征提取、数据降维和任务分类。在人脸识别、人脸检测等领域发挥重要作用。LDA算法与PCA算法都是常用的降维技术。二者的区别在于&a…

数据结构层次遍历二叉树

2022.11.19 计算二叉树的深度和节点个数 任务描述相关知识编程要求测试说明C/C代码 任务描述 本关任务&#xff1a;给定一棵二叉树&#xff0c;借助队列实现层次遍历二叉树。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.队列基本操作&#xff0c;2.二叉…

树的层次遍历

二叉树的前序、中序、后序遍历我想大家应该都很熟悉了&#xff0c;那我们今天就来讲一下二叉树的层次遍历。 二叉树的前序、中序、后序遍历需要用到栈&#xff08;递归的过程也就是一个栈&#xff09;&#xff0c;层次遍历需要借助队列这个数据结构。 层次遍历的思路 我们给…

层次遍历_树

哈喽大家好&#xff0c;这里是蒟蒻hanyiyang的博文&#xff0c;今天&#xff0c;我来给大家&#xff0c;介绍一个关于图的算法&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 层次遍历 大家来看一看上面这个图&#xff0c;为什么要说这是层次遍历呢&…