算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

    • 二叉树的最大深度
    • 相同的树
    • 翻转二叉树
    • 二叉树中的最大路径和
    • 二叉树的层序遍历
      • 题目描述
      • 知识回顾
      • 思路解析
      • C++代码
      • 复杂度分析
    • 二叉树的序列化与反序列化
    • 另一棵树的子树
    • 从前序与中序遍历序列构造二叉树
    • 验证二叉搜索树
    • 二叉搜索树中第K小的元素
    • 二叉搜索树的最近公共祖先
    • 实现 Trie (前缀树)
    • 添加与搜索单词 - 数据结构设计
    • 单词搜索 II
  • 堆

  • 逻辑思维

  • 目录
  • 树
华南溜达虎
2024-07-08
目录

二叉树的层序遍历

题目链接: https://leetcode.cn/problems/binary-tree-level-order-traversal/

# LeetCode 102. 二叉树的层序遍历

# 题目描述

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

举个例子:

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

# 知识回顾

广度优先搜索(BFS) 是一种图形搜索算法,它的基本思想是从一个顶点出发,先访问它的所有邻接顶点,然后再按照同样的方式访问这些邻接顶点的未访问邻接顶点,直到图中所有顶点都被访问。广度优先搜索算法通常使用队列来存储待访问的顶点,并使用一个数组或者集合来记录已访问的顶点。

# 思路解析

二叉树作为一种特殊的图,广度优先搜索(BFS)同样适用于二叉树的遍历,广搜的特点就是一层一层的遍历,很符合题目中按层序遍历的要求。因为广搜一般会使用一个队列来保存待访问的节点,节点进入队列的顺序又决定了每一层的节点访问时的顺序。对于二叉树如果左孩子先入队那么每一层的访问顺序是从左到右,如果右孩子先入队那么每一层的访问顺序是从右到左。

下面就以题目描述中给的例子来模拟下整个层序遍历的过程,为了更好的理解广搜在层序遍历中的应用,同学们最好在纸上自己模拟一遍加深理解。

  1. 根节点首先入队。

  1. 访问队列中的二叉树的第一层节点,并将第一层节点的左孩子和右孩子依次入队。第一层节点访问完,第二层的节点自左向右已经全部入队。

  1. 访问队列中的二叉树的第二层节点,并将第二层节点的左孩子和右孩子依次入队。第二层节点访问完,第三层的节点自左向右已经全部入队。

  1. 直到队列为空,返回的顺序为[[3], [9, 20], [15, 7]]。

# C++代码

/**
 * 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);
        while (!q.empty()) {
            //队列中元素的个数
            int q_len = q.size();
            vector<int> tmp_vec;
            //从队列中取出q_len在同一层的元素
            for (int i = 0; i < q_len; ++i ) {
                TreeNode* node = q.front();
                q.pop();
                tmp_vec.push_back(node->val);

                //把左右孩子放入队列中,左孩子先入队列
                if (node->left)
                    q.push(node->left);
                if (node->right)
                    q.push(node->right); 
             }
            if (q_len > 0) {
                res.push_back(tmp_vec);
            }
        }
        return res;
    }
};

# 复杂度分析

时间复杂度: 需要遍历整棵树,所以时间复杂度和树的总节点数相关。

空间复杂度: 需要利用一个队列,队列的长度和树的总节点数相关,所以空间复杂度也是和树的总节点数相关。

上次更新: 2024/07/08, 20:31:33
二叉树中的最大路径和
二叉树的序列化与反序列化

← 二叉树中的最大路径和 二叉树的序列化与反序列化→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式