【代码随想录】LC 102. 二叉树的层序遍历

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴

一、题目

1、原题链接

力扣


2、题目描述

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


示例 1:

1.png





输入:root = [3,9,20,null,null,15,7]

输出:[[3],[9,20],[15,7]]


示例 2:

输入:root = [1]

输出:[[1]]


示例 3:

输入:root = []

输出:[]


提示:

树中节点数目在范围 [0, 2000] 内

-1000 <= Node.val <= 1000


二、解题报告

思路来源:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili


卡哥yyds


1、思路分析

1)可以利用队列来进行层序遍历。

2)如果根结点为空,则直接返回结果数组;如果根结点非空,在每次遍历一层的过程中,针对该层中的每个结点,首先将结点入队,然后将该结点存下来,结点出队,用记录结点的变量来访问该节点的数值,并存到一维数组中,如果该结点有孩子,则将其对应的左/右孩子结点入队,直到遍历完该层结点。然后再以同样方式遍历下一层结点,直到队列为空(代表已经遍历完所有元素)。用lq来记录当前层的结点个数,针对每层,将每层遍历的结点的值存入一维数组中,每遍历完一层,再将该数组存入二维结果数组中,用来结果的返回。

3)注意lq不能用q.size()来代替,因为队列大小一直在变化,队列中会进入其他层的结点,我们只是用lq来记录当前遍历层的结点个数。

4)模拟上述过程,返回结果数组,即为所求。


2、时间复杂度

时间复杂度为O(n)


3、代码详解

/**

* Definition for a binary tree node.

* struct TreeNode {

*     int val;

*     TreeNode *left;

*     TreeNode *right;

*     TreeNode() : val(0), left(nullptr), right(nullptr) {}

*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

class Solution {

public:

   vector<vector<int>> levelOrder(TreeNode* root) {

     vector<vector<int>> res;

     queue<TreeNode*> q;

     if(root)

        q.push(root);

     vector<int> v;

     while(!q.empty()){

        int lq=q.size();

        while(lq--){

         TreeNode *temp=q.front();

         q.pop();

         v.push_back(temp->val);

         if(temp->left)

             q.push(temp->left);

         if(temp->right)

             q.push(temp->right);    

     }

     res.push_back(v);

     v.clear();

   }

   return res;

   }

};

三、知识风暴

clear();//删除vector容器中的所有元素


目录
相关文章
【代码随想录】LC 704. 二分查找
防止溢出可以将int mid = (left + right) / 2;改为 int mid = left + ((right - left) / 2);或int mid = left + ((right - left) >> 1);。 数组理论基础 数组下标都是从0开始的 数组在内存空间的地址是连续的 数组中的元素只能覆盖,不能删除。
45 0
|
4月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
109 2
|
8月前
|
存储 算法 IDE
数据结构与算法⑯(第四章_下)二叉树的层序遍历+判断完全二叉树+一道OJ
数据结构与算法⑯(第四章_下)二叉树的层序遍历+判断完全二叉树+一道OJ
60 1
|
8月前
|
Python Java Go
Java每日一练(20230419) 二叉树的最大深度、层序遍历、最短回文串
Java每日一练(20230419) 二叉树的最大深度、层序遍历、最短回文串
80 0
Java每日一练(20230419) 二叉树的最大深度、层序遍历、最短回文串
|
8月前
|
存储 算法
常见的二叉树系统题解(二)
常见的二叉树系统题解(二)
|
8月前
|
存储 算法
常见的二叉树系统题解(一)
常见的二叉树系统题解(一)
|
算法
代码随想录算法训练营第十四天 | LeetCode 102. 二叉树的层序遍历、LeetCode 226. 翻转二叉树、LeetCode 101. 对称二叉树
代码随想录算法训练营第十四天 | LeetCode 102. 二叉树的层序遍历、LeetCode 226. 翻转二叉树、LeetCode 101. 对称二叉树
63 0
二叉树中和为某一值的路径(剑指offer34 力扣113)Java深度优先遍历
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。
二叉树中和为某一值的路径(剑指offer34 力扣113)Java深度优先遍历
|
算法 Java
序列化二叉树(剑指offer37 力扣297)Java层序遍历
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
122 0
序列化二叉树(剑指offer37 力扣297)Java层序遍历
二叉树的最近公共祖先(剑指offer 68 - II)Java深度优先遍历
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
二叉树的最近公共祖先(剑指offer 68 - II)Java深度优先遍历