力扣刷题之二叉树的层序遍历

article/2025/9/17 19:54:13

                                                  Welcome to you每日一刷系列


二叉树的层序遍历

二叉树的层序遍历II

二叉树的右视图

二叉树的层平均值

N叉树的层序遍历

在每个树行中找最大值

填充每个节点的下一个右侧节点指针

填充每个节点的下一个右侧节点指针II

二叉树的最大深度

二叉树的最小深度


二叉树的层序遍历

广度优先搜索

我们可以用一种巧妙的方法修改广度优先搜索:

  • 首先根元素入队
  • 当队列不为空的时候

       1.求当前队列的长度 Si
       2.依次从队列中取 Si 个元素进行拓展,然后进入下一次迭代

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) { //初始化队列同时将第一层节点加入队列中,即根节点queue<TreeNode*> az;vector<vector<int>> sz;if(root==nullptr){return sz;}az.push(root);//外层的while循环迭代的是层数while(!az.empty()){//记录当前队列大小int size=az.size();vector<int> a;//遍历这一层的所有节点for(int i=0;i<size;i++){ //从队首取出元素TreeNode* node=az.front();az.pop();a.push_back(node->val);if(node->left) az.push(node->left);if(node->right)az.push(node->right);}sz.push_back(a);}return sz;}
};

大家请记住这个模板,后面的几个练习题,都是在这个上面稍作更改.

二叉树的层序遍历II

相对于上面的题目,我们就需要把数组翻转一下就好了.

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){vector<int> a;int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();a.push_back(node->val);if(node->left) sz.push(node->left);if(node->right) sz.push(node->right);}az.push_back(a);}reverse(az.begin(),az.end());return az;}
};

二叉树的右视图

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();if(i==size-1){az.push_back(node->val);}if(node->left)sz.push(node->left);if(node->right)sz.push(node->right);}}return az;}
};

二叉树的层平均值

本题就是层序遍历的时候把一层求个总和在取一个均值。

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {vector<double> az;queue<TreeNode*> sz;if(root==nullptr)
{return az;
}     sz.push(root);while(!sz.empty()){double sum=0;int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();sum+=node->val;if(node->left)sz.push(node->left);if(node->right)sz.push(node->right);}az.push_back(sum/size);}return az;}
};

N叉树的层序遍历

 这题就是跟第一题基本一样的,只不过节点多了几个孩子

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> az;queue<Node*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){vector<int> a;int size=sz.size();for(int i=0;i<size;i++){Node* node=sz.front();sz.pop();a.push_back(node->val);for(int i=0;i<node->children.size();i++){if(node->children[i])sz.push(node->children[i]);}}az.push_back(a);}return az;}
};

在每个树行中找最大值

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){int size=sz.size();int max=INT_MIN;for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();max=max>node->val?max:node->val;if(node->left) sz.push(node->left);if(node->right)sz.push(node->right);}az.push_back(max);}return az;}
};

填充每个节点的下一个右侧节点指针

回想一下二叉树的层次遍历,用广度优先实现的时候,就是层层遍历,每层临时遍历的节点都会放到一个队列中。队列中保存了第 i 层节点的信息,我们利用这个特点,将队列中的元素都串联一遍就可以了。

class Solution {public Node connect(Node root) {if (root == null) {return root;}// 初始化队列同时将第一层节点加入队列中,即根节点Queue<Node> queue = new LinkedList<Node>(); queue.add(root);// 外层的 while 循环迭代的是层数while (!queue.isEmpty()) {// 记录当前队列大小int size = queue.size();// 遍历这一层的所有节点for (int i = 0; i < size; i++) {// 从队首取出元素Node node = queue.poll();// 连接if (i < size - 1) {node.next = queue.peek();}// 拓展下一层节点if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}}// 返回根节点return root;}
}

填充每个节点的下一个右侧节点指针II

和上题是完全一样的

class Solution {
public:Node* connect(Node* root) {if (root == nullptr) {return root;}// 初始化队列同时将第一层节点加入队列中,即根节点queue<Node*> Q;Q.push(root);// 外层的 while 循环迭代的是层数while (!Q.empty()) {// 记录当前队列大小int size = Q.size();// 遍历这一层的所有节点for(int i = 0; i < size; i++) {// 从队首取出元素Node* node = Q.front();Q.pop();// 连接if (i < size - 1) {node->next = Q.front();}// 拓展下一层节点if (node->left != nullptr) {Q.push(node->left);}if (node->right != nullptr) {Q.push(node->right);}}}// 返回根节点return root;}
};

二叉树的最大深度

这题前面有讲过, 可以参考这篇博客:力扣刷题之二叉树的最大深度_skeet follower的博客-CSDN博客 

二叉树的最小深度

 

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点

class Solution {
public:int minDepth(TreeNode* root) {queue<TreeNode*> az;if(root==nullptr){return 0;}int depth=0;az.push(root);while(!az.empty()){int size=az.size();depth++;for(int i=0;i<size;i++){TreeNode* node=az.front();az.pop();if(node->left) az.push(node->left);if(node->right)az.push(node->right);if(node->right==nullptr&&node->left==nullptr){return depth;}}}return depth;}
};


http://chatgpt.dhexx.cn/article/9HTmUn93.shtml

相关文章

C语言-二叉树的层序遍历

前言 承接上节&#xff0c;树的非递归三种遍历我们使用了栈&#xff0c;今天讲解的树的层序遍历&#xff0c;我们需要使用另外一种数据结构——队列 我们先简单的回忆一下什么是队列 1.队列 概念&#xff1a;一端入元素&#xff0c;另一端出元素的线性表 一端&#xff1a;队尾 …

二叉树层序遍历

二叉树层序遍历 给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ]提示: 0 < 二叉树的…

二叉树之层序遍历

遍历规则&#xff1a;二叉树的层次遍历就是按照从上到下每行&#xff0c;然后每行中从左到右依次遍历&#xff0c;得到的二叉树的元素值。 思路&#xff1a;对于层次遍历&#xff0c;我们通常会使用队列来辅助&#xff1a;因为队列是一种先进先出的数据结构&#xff0c;我们依…

【LeetCode】专题一 二叉树层序遍历

二叉树层序遍历 在本文中&#xff0c;我将会选取LeetCode上二叉树层序遍历的多道例题&#xff0c;并给出解答&#xff0c;通过多道题我们就可以发现&#xff0c;二叉树的层序遍历并不复杂&#xff0c;并且有着共通点。 102. 二叉树的层序遍历 给你二叉树的根节点 root &…

二叉树的层序遍历-Java

目录 一、题目描述 二、运行结果 三、解题思路 四、代码 一、题目描述 本文代码为力扣102题解题代码&#xff0c;也是通用的二叉树层次遍历代码&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访…

102 二叉树层序遍历

层序遍历&#xff0c;每次层的输出是是一个一维数组&#xff0c;整个二叉树的输出结果是二维数组 BFS遍历&#xff0c;依托于队列结构&#xff0c;每次在根节点出栈的时候&#xff0c;将其值加在结果列表中&#xff0c;然后将他的左右孩子节点入队列。 层序遍历相对于BFS&…

【LeetCode102. 二叉树的层序遍历】——层序遍历

102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示…

层序遍历总结

以 LeetCode102 作为例子&#xff1a; 题目描述 思路描述 层序遍历需要用到的数据结构是队列。需要考虑的问题是&#xff1a;如何标识当前节点的层数。 有以下三种方法&#xff1a; 方法 1 将每个节点表示为一个二元组 (node, level)&#xff0c;这种方法效率太低&#xff…

层序遍历?看这一篇就够了!

点关注不迷路 1.树的层序遍历 顾名思义&#xff0c;对于树型结构&#xff0c;层序遍历就是按层从上到下&#xff0c;每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明&#xff1a;对于左边的二叉树&#xff0c;按层划分后可得到右边的分层结构。 如果按照…

二叉树遍历——层序遍历

目录 1.什么是层序遍历&#xff1f; 2.实现思路 3.代码实现 1.什么是层序遍历&#xff1f; 就是将一颗树按照每一层每一层的方式进行遍历 例如这棵树&#xff0c;进行层序遍历的结果应该是 那么我们该怎样去实现呢&#xff1f; 2.实现思路 利用队列先进先出的思想去实现 …

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

一、层序遍历定义&#xff1a; 按照每层进行遍历&#xff0c;从左至右&#xff0c;从上至下遍历树的节点&#xff0c;如下图所示 二、题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所…

二叉树----层序遍历

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不同)。 ● 主要思想:…