C++手撕LeetCode——二叉树遍历(BFS层序遍历)

2023-05-16

 大三寒假要结束了,继续备战秋招,年前刷了些双指针、数组、链表的简单LeetCode题,都没有做笔记,现在也忘得差不多了,计划写一份专栏记录刷题的过程,复盘算法中的细节,由易到难,先刷简单题,再斩中等题!  


         一转眼就到4月份了,投递了好多暑期实习,4月份笔面试就会陆续开启,距离秋招也越来越近,这段时间在刷LeetCode Hot 100,每天刷个两道mid题,同时作个笔记,作为复盘,也作为到时笔面试前的复习资料

目录

一、关键思路:BFS(广度优先搜索)

二、BFS法优点

三、例题训练

3.1 二叉树的层序遍历


一、关键思路:BFS(广度优先搜索)

      广度优先搜索(Breadth-First Search,BFS)算法是一种图形搜索算法,它从起始点开始,逐层搜索周围的节点,直到找到目标节点或者所有可达节点都被搜索到。BFS算法通常用于无权图或者所有边权相等的图中寻找最短路径。

BFS算法的基本思路是利用队列(Queue)数据结构来实现。具体实现过程如下:

  1. 将起始点放入队列中,并标记为已访问。
  2. 从队列中取出队首节点,并访问其周围所有未被访问过的节点。
  3. 对于每个未被访问过的节点,将其加入队列中,并标记为已访问。
  4. 重复步骤2和步骤3,直到找到目标节点或者队列为空。

BFS算法的时间复杂度为O(V+E),其中V为节点数,E为边数。因为BFS算法需要访问所有的节点和边,所以时间复杂度是线性的。BFS算法也可以用于判断图是否为连通图,如果BFS能够访问到所有的节点,则说明图是连通图。

二、BFS法优点

        BFS算法的优点是找到的路径一定是最短路径,缺点是空间复杂度较高,因为需要保存所有已经访问过的节点。此外,在面对大规模的图时,BFS算法可能会陷入无限循环,因为搜索过程需要访问所有可达节点,有两大应用场景:「层序遍历」、「最短路径」

三、例题训练

3.1 二叉树的层序遍历

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


示例 1:

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

  • 实现思路:

1.创建一个队列,用于存储每一层的节点。

2.将根节点root加入队列中。

3.循环遍历队列中的节点,每次取出一个节点,并将其左右子节点加入队列中。

4.将当前节点的值存储到一个列表中,表示当前层的节点值。

5.重复步骤3和4,直到队列为空。

6.返回存储节点值的列表。

  • 核心思路:

        传统的BFS(广度优先搜索)算法中,遍历结果是一个一维数组,无法区分每一层,我们无法区分队列中的结点来自哪一层,而本题所需的是BFS的层序遍历版本,遍历结果应为一个二维数组,区分开每一层

        因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。。

  • 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;
        if(!root)
        return res;
        queue <TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            int cur =q.size();
            res.push_back(vector<int>());
            for(int i=0;i<cur;i++)
            {
                TreeNode* node = q.front();
                q.pop();
                res.back().push_back(node->val);
                if(node->left)
                q.push(node->left);
                if(node->right)
                q.push(node->right);
            }
        }
        return res;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++手撕LeetCode——二叉树遍历(BFS层序遍历) 的相关文章

  • Linux系统项目部署常见问题

    目录 进入数据库 修改数据库密码 未设置或忘记 部署操作 使用jar包部署和修改操作 使用war包部署 修改端口号 ssm项目打包war包可能遇到问题 进入数据库 没有设置数据库密码则使用 mysql uroot 设置了数据库密码则使用 m
  • 音乐web网站搭建思路

    目录 项目所涉及的页面及对应功能 项目设计思路 数据库设计 Http响应数据格式设计 页面各个功能的请求响应格式设计 1 登录功能 2 上传音乐功能 3 删除音乐功能 4 批量删除音乐 5 查询音乐信息 6 收藏音乐 取消收藏音乐 7 播放
  • 五子棋项目

    目录 核心技术 主要模块和功能 基本思路 注册 登录接口 具体实现 匹配功能接口 具体实现 用户对战接口 具体实现 项目源码Gitee地址 网页版五子棋的基本思路及实现 核心技术 Spring SpringBoot SpringMVCWeb
  • Redis笔记

    Redis 内容来自菜鸟教程 redis部分 REmote DIctionary Server Redis 是一个由 Salvatore Sanfilippo 写的 key value 存储系统 xff0c 是跨平台的非关系型数据库 Red
  • Jmeter接口测试实战练习题及答案(本博客原创·全网首发)

    接口地址 Post xff1a http 10 9 15 72 8093 Api PayGateway 接口参数 参数名 参数值 说明 SystemCode Alipay 系统代码 plateformCode Alipay 平台代码 ser
  • 《操作系统》-生产者消费者问题

    什么是生产者消费者问题 xff1f 系统中有一组生产者进程和一组消费者进程 生产者进程每次生产一个产品放入缓冲区 xff0c 消费者进程每次从缓冲区中取出一个进程并使用 xff0c 那么他们之间具有这样一层关系 生产者 消费者共享一个初始为
  • 普通类和抽象类的区别

    普通类和抽象类的区别 抽象类普通类普通类和抽象类的区别总结 抽象类 含有抽象方法的类就叫抽象类 而抽象方法就是被abstract修饰的方法 xff0c 这个方法可以没有具体的实现 在抽象类的子类中必须对抽象方法进行重写 xff0c 当其子类
  • PowerShell 安装、配置和美化

    文章目录 安装 Windows TerminalPowerShell 7安装 PowerShell 7查看版本Winget 安装安装 MSI 包 配置开启 PSReadLine 2 1 预测性 IntelliSense其他配置 美化手动安装
  • c++学习笔记(八)程序一闪而过怎么办?如何让命令提示符暂停?

    在使用控制台输出的时候 xff0c 你可能经常遇到还没有看清楚输出结果如何就自动退出的情景 这很令人头疼 xff0c 下面我就介绍几种方式避免控制台退出 当然你使用CLion可以不写 xff0c 节约时间 xff0c 但是也要知道 xff0
  • Zabbix 6.0 图文安装部署讲解---LNMP环境

    Zabbix 6 0 图文安装部署讲解 LNMP环境 简介环境需求部署环境关闭系统防火墙一 Mysql8 0 30 部署 二 nginx 部署三 PHP 部署四 zabbix server 部署五 Web端初始化六 解决zabbix 6 0
  • Hive 不同级别日志配置 hive-log4j2.properties

    span class token comment Licensed to the Apache Software Foundation ASF under one span span class token comment or more
  • 飞机订购票系统(数据库课程大作业)

    一 需求分析 nbsp 1 1 功能需求及描述 nbsp nbsp nbsp nbsp 通过对机票预定业务的调查 明确了飞机订购票系统共包括乘客信息模块 航班信息模块 机票订购模块 机票退票模块以及取票信息模块五个模块 图1 1 总体功能模
  • 本地与linux服务器文件互传(超简单)

    利用系统自带的命令行窗口powershell上传 xff08 win10以上系统自带的 xff0c 系统级应用 xff0c 十分推荐使用 xff09 在这Linux 用户名 xff1a hadoop ip 192 168 53 20 打开搜
  • 【剑指offer系列】剑指offer 03-06

    这次我们来讲解剑指offer的全部题目 xff0c 今天是第一天 xff0c 我们来讲解第三题到第六题 xff08 我也不清楚为什么力扣上查不到第一题和第二题 xff09 一 剑指offer 03 题目链接 xff1a 力扣 题目描述 xf
  • 什么是scrum中的3355

    scrum的3355是指 xff1a 3个工件 xff1a 产品Backlog Sprint Backlog 潜在可交付软件增量 3个角色 xff1a PO Master 团队 xff08 最适合人数为7 2到7 43 2之间 xff09
  • 搭建ant+jenkins+jmeter自动化接口测试框架(详细篇)

    引言 为什么要持续集成 1 减少风险 2 减少假定 3 减少重复过程 4 增强项目的可见性 5 持续集成可以带来两点积极效果 xff1a 1 有效决策 xff1a 持续集成系统为项目构建状态和品质指标提供了及时的信息 xff0c 有些持续集
  • Linux C生产者和消费者(线程)

    生产者和消费者 生产者消费者问题实现目标原理代码 生产者消费者问题 生产者消费者共享缓冲区 xff0c 生产者向缓冲区中放数据 xff0c 消费者从缓冲取中取数据 xff0c 当缓冲区中被放满时 xff0c 生产者进程就必须进入挂起状态 x
  • HPE DL388GEN9 /windows server 2012r2 重置管理员密码/忘记管理员密码

    有台HPE DL388GEN9 windows server 2012r2的主机 xff0c 不知道密码 从CSND上查了有人可以通过U盘PE进去用工具去改掉 实测 xff0c 难以进入PE xff08 也可能是我操作有问题 xff09 x
  • ArchLinux,ManjaroLlinux安装,运行Android软件。安装anbox(详细)

    安装anbox我也是用了一个下午的时间来进行安装 xff0c 因此我做了一下总结 xff0c 方便大家安装 这个安装教程arch和manjaro都是可以实现的 xff0c 因为manjaro是arch的分支 xff0c 同样也可以使用anb
  • ArchLinux的安装(BIOS引导方式安装)

    archlinux的安装对于很多新手朋友很不友好 xff0c 于是我对archlinux的安装做了一下整理 xff0c 方便大家安装 安装之前我们需要准备一下 xff1a archlinux的镜像iOS文件 U盘 xff0c 或者虚拟机 脑

随机推荐