LeetCode hot 100—二叉树的层序遍历

题目

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

示例

示例 1:

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

复制代码
输入:root = [1]
输出:[[1]]

示例 3:

复制代码
输入:root = []
输出:[]

分析

二叉树的层序遍历可以借助队列来实现。层序遍历的核心思路是从根节点开始,依次访问每一层的节点,并且从左到右逐个访问。

广度优先搜索

首先判断根节点是否为空,若为空则直接返回空的结果。初始化一个队列,将根节点加入队列。

当队列不为空时,进行以下操作:

  1. 记录当前队列的大小,这个大小就是当前层的节点数量
  2. 遍历当前层的所有节点,将节点的值存入当前层的结果数组中,同时将节点的左右子节点(如果存在)加入队列
  3. 将当前层的结果数组加入最终结果

时间复杂度:O(), 为二叉树节点的个数

空间复杂度:O(), 是二叉树中节点数最多的那一层的节点数

cpp 复制代码
class Solution {
public:
    std::vector<std::vector<int>> levelOrder(TreeNode* root) {
        std::vector<std::vector<int>> result;
        if (root == nullptr) {
            return result;
        }
        std::queue<TreeNode*> nodeQueue;
        nodeQueue.push(root);
        while (!nodeQueue.empty()) {
            int levelSize = nodeQueue.size();
            std::vector<int> currentLevel;
            for (int i = 0; i < levelSize; ++i) {
                TreeNode* currentNode = nodeQueue.front();
                nodeQueue.pop();
                currentLevel.push_back(currentNode->val);
                if (currentNode->left) {
                    nodeQueue.push(currentNode->left);
                }
                if (currentNode->right) {
                    nodeQueue.push(currentNode->right);
                }
            }
            result.push_back(currentLevel);
        }
        return result;
    }
};
相关推荐
Wei&Yan5 分钟前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
团子的二进制世界39 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
吃杠碰小鸡43 分钟前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨43 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long31644 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
近津薪荼1 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
熊文豪1 小时前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
熊猫_豆豆1 小时前
YOLOP车道检测
人工智能·python·算法
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
偷吃的耗子2 小时前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn