队列+宽搜(BFS)

news2024/12/28 13:22:24

前言

宽搜属于搜索类算法

搜索类算法:

  • 深搜(DFS)
  • 宽搜(BFS)

宽搜可以解决树、图、最短路径、迷宫、拓扑排序等问题

429. N 叉树的层序遍历

题目链接:429. N 叉树的层序遍历

题目解析

题目意思就是对这个N叉树进行一个层序遍历,记录每一层的结果

算法原理

这里每层遍历的时候,需要记录下一层的顺序,用一个队列来进行存储:

  • 根节点不为空,根节点入队
  • 队列不为空,while循环,拿出对头元素,让对头元素的孩子入队
  • 往后的操作都是,拿出对头元素,孩子入队,直到队列为空

这样要知道每一次多少个元素,只需在层序遍历之前,统计当前队列里的个数即可,当前队列里元素的个数,就是该层元素的个数

代码实现

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root)
    {
        queue<Node*> q;
        vector<vector<int>> ret;
        if(root == nullptr) return ret;
        q.push(root);
        while(!q.empty())
        {
            int cnt = q.size(); //该层元素的个数
            vector<int> tmp;    //记录本层节点的值
            while(cnt--)
            {
                Node *cur = q.front();
                q.pop();
                for(const auto &e : cur->children) //下一层孩子入队
                {
                    if(e != nullptr)
                    {
                        q.push(e);
                    }
                }
                tmp.push_back(cur->val);
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};

103. 二叉树的锯齿形层序遍历

题目链接:103. 二叉树的锯齿形层序遍历

题目解析

这次和上面一题差不多,只不过这里是二叉树,然后就是稍微修改了一下层序遍历的规则,这里的层序遍历是锯齿形(如下图)

image-20240908210358140

算法原理

还是采用层序遍历,然后加一个标记位,偶数行的数据逆序即可

代码实现

/**
 * 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>> zigzagLevelOrder(TreeNode* root)
    {
        queue<TreeNode*> q;
        vector<vector<int>> ret;
        bool flag = false;
        if(root == nullptr) return ret;
        q.push(root);
        while(!q.empty())
        {
            vector<int> tmp;
            int cnt = q.size();
            while(cnt--)
            {
                TreeNode *cur = q.front();
                q.pop();
                if(cur->left)   q.push(cur->left);
                if(cur->right)  q.push(cur->right);
                tmp.push_back(cur->val);
            }
            if(flag)
            {
                reverse(tmp.begin(), tmp.end());
            }
            ret.push_back(tmp);
            flag = !flag;
        }
        return ret;
    }
};

662. 二叉树最大宽度

题目链接:662. 二叉树最大宽度

题目解析

这里统计所有层数当中的最大宽度。

这里的的宽度指的是从该层的最左和最右的非空节点的长度,如下图:

image-20240908212900846

算法原理

解法1:

这里直接硬来,创建一个队列,因为要统计空节点的个数,所有直接将空节点也加入到队列当中,这样就能统计出当前层的宽度。

这样就会有一个问题:

image-20240908215415935

此时可以定义一个empty遍历,来统计空节点的个数,碰到不是空节点的时候,就算长度,然后再往后走,看看还有没有节点,有就更新。

这个会超时,因为数据是范围是[1, 3000]

image-20240908215854990

最后一层的节点个数约为21499,这个数据内存都存不下。

解法二:

树不仅可以链式存储,还可以利用数组存储,例如这个数据结构,它就是用数组来模拟的。

这样将树的节点编号,就不需要存储空节点了

image-20240908220928275

此时就可以创建一个队列,队列里面存一个pair<TreeNode*, int>,每次进队的时候,让该节点绑定它的编号,要计算宽度,只需要用队尾-队头+1

Tips1:

可以直接用数组模拟队列,这样非常容易找到队头及队尾。

此外,由于经常需要入队,数组的头删效率十分低下,为了避免这个问题,我们可以创建一个新数组,用改数组接收下一层的信息,然后直接覆盖之前的数组即可。

Tips2:

这个下标可能溢出,还是用解法一的超时用例举例,最下面一层的下标是21500 - 1,不管是long还是long long 还是double,都是存不下的。

不过不要紧,因为最后做减法,即使溢出结果也是正确的,因为数据的存储是可以看作一个环的

image-20240908221733903

代码实现

/**
 * 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:
    int widthOfBinaryTree(TreeNode* root)
    {
        vector<pair<TreeNode*, unsigned int>> q;
        q.push_back({root, 1}); //下标从1开始
        unsigned int ret = 0;
        while(q.size())
        {
            //计算该层宽度
            auto& [x1, y1] = q[0];
            auto& [x2, y2] = q.back();
            ret = max(ret, y2 - y1 + 1);
            //下一层进队
            vector<pair<TreeNode*, unsigned int>> tmp;
            for(auto &[x, y] : q)
            {
                if(x->left) tmp.push_back({x->left, y * 2});
                if(x->right) tmp.push_back({x->right, y * 2 + 1});
            }
            //覆盖之前的
            q = tmp;
        }
        return ret;
    }
};

515. 在每个树行中找最大值

题目链接:515. 在每个树行中找最大值

题目比较简单,就不解析了

思路就是利用层序遍历,统计出每一层的最大值即可…

/**
 * 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<int> largestValues(TreeNode* root)
    {
        vector<int> ret;
        if(root == nullptr) return ret;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            int tmp = INT_MIN;
            int cnt = q.size();
            while(cnt--)
            {
                TreeNode *cur = q.front();
                tmp = max(tmp, cur->val);
                q.pop();
                if(cur->left)
                {
                    q.push(cur->left);
                }
                if(cur->right)
                {
                    q.push(cur->right);
                }
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ETCD的备份和恢复

一、引言 ETCD是一个高度可用的键值存储系统&#xff0c;被广泛应用于Kubernetes等分布式系统中以存储关键配置数据和服务发现信息。由于ETCD的重要性&#xff0c;确保其数据的安全性和可靠性至关重要。本文将介绍ETCD备份与恢复的基础知识、常用方法及最佳实践。 二、概述 …

Qt绘制动态仪表

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…

Linux 中 Tail 命令的 9 个实用示例

引言 我们作为 Linux 用户&#xff0c;经常会操作那些在后台长时间运行的进程&#xff0c;这些进程被称作守护进程或服务。例如 Secure Shell (sshd)、Network Manager (networkd)、Volume Manager (LVM)、Cron 等都是服务的典型例子&#xff0c;这样的服务还有很多。 在许多情…

1.10 DFT示例1

1.10 DFT示例1 Tips&#xff1a;离散傅里叶的不同角度的解释。 参考&#xff1a;https://mp.weixin.qq.com/s/TrRmqkc34Zqw9pgaITqlZg?poc_tokenHF5h1WajXiXCmFpwIbv1HaHN52KsET1UE29CM561 摘取部分核心观点&#xff1a; 站在高观点下看问题&#xff0c;傅里叶变换本质上是…

MySQL表的操作与数据类型

目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览&#xff1a; 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作&#xff0c;本节要讲解的是由库管理的结构——…

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

目录 前言PointCNN实现细节1. X X X-Conv 操作输入输出步骤 2. PointCNN 网络架构层级卷积分类与分割任务 3. 数据增强4. 效率优化 前言 这篇论文介绍了一种名为 PointCNN 的方法&#xff0c;旨在从点云&#xff08;point cloud&#xff09;数据中学习特征。传统卷积神经网络…

华为 HCIP-Datacom H12-821 题库 (9)

有需要题库的可以看主页置顶 V群进行学习交流 1.以下关于 RSTP 保护功能的描述&#xff0c;错误的是哪一选项&#xff1f; A、环路保护可以部署在根端口上&#xff0c;以防网络中形成环路 B、环路保护可以部署在Alternate 端口上&#xff0c;以防网络中形成环路 C、BPDU 保…

“短视频 + ”新业态下的高职院校数字媒体技术专业群建设方案

一、引言 短视频&#xff0c;亦称短片视频&#xff0c;是在移动互联网快速普及背景下兴起的一种新兴媒体形态&#xff0c;它继承了传统影视行业的一些特点并加以创新。相较于传统的文字和图片传播方式&#xff0c;短视频集声音与影像于一体&#xff0c;能够承载更多的信息量&a…

【JAVA开源】基于Vue和SpringBoot的网上订餐系统

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

缓存对象反序列化失败

未定义serialVersionUID&#xff0c;会自动生成序列化号 新增了属性&#xff0c;序列号就变了&#xff0c;导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id&#xff01; 那我如何找到未添加字段前 对象的序列化号呢&#xff1f;默认的序列化号是如何生成的呢&#…

11、Hive+Spark数仓环境准备

1、 Hive安装部署 1&#xff09;把hive-3.1.3.tar.gz上传到linux的/opt/software目录下 2&#xff09;解压hive-3.1.3.tar.gz到/opt/module/目录下面 [shuidihadoop102 module]$ tar -zxvf /opt/software/hive-3.1.3.tar.gz -C /opt/module/ 3&#xff09;修改hive-3.1.3-b…

车辆目标检测数据集 19000张 带标注 voc yolo

数据集名称&#xff1a; 车辆目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;19000张标注类型&#xff1a;车辆检测&#xff08;包括但不限于轿车、卡车、公交车、摩托车等&#xff09;格式兼容性&#xff1a;支持VOC和YOLO标注格式 数据集内容&#xff1a; 该…

IP网络广播服务平台任意文件上传漏洞

文章目录 免责声明搜索语法漏洞描述漏洞复现修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 搜索语法 icon_hash"-568806419"漏洞描述 该系统在upload接口处可上传任…

SOMEIP_ETS_099: SD_ClientServiceActivate

测试目的&#xff1a; 验证DUT能够在不停止其已运行的服务器模式的情况下&#xff0c;被触发进入客户端模式。 描述 本测试用例旨在确保DUT能够在保持服务器模式运行的同时&#xff0c;启动客户端模式的启动程序&#xff0c;并准备好作为客户端进行操作。 测试拓扑&#xf…

机器人入门系列:《通过蓝牙模块通讯控制机器人电机转动》

一、引言 在现代科技高速发展的今天&#xff0c;机器人技术作为自动化和智能化领域的重要分支&#xff0c;正以前所未有的速度改变着我们的生活和生产方式。其中&#xff0c;无线通信技术作为机器人远程控制的关键技术之一&#xff0c;其重要性不言而喻。蓝牙技术&#xff0c;…

Deepl翻译VS行业TOP3,你的翻译神器是哪款?

现在世界变得越来越小&#xff0c;大家都在用不同的语言交流&#xff0c;这时候翻译工具就特别重要了。不管是搞研究、谈生意&#xff0c;还是平时聊天&#xff0c;翻译软件都超级有用。在这么多翻译工具里&#xff0c;Deepl翻译这样的软件特别受欢迎。咱们今天就来比一比&…

复盘:求职两个月还没找到工作,深刻反思

一、求职反思 复盘下&#xff0c;求职两个月还没找到工作&#xff0c;心态在快崩溃的边缘又被拉回来了。 历经两个月的征途&#xff0c;找工作打招呼和投简历不下百次&#xff0c;用了三个APP&#xff0c;猎聘、boss直聘、智联。真的感觉粥多僧少。从一开始挑公司、薪酬&…

运营商不给降套餐怎么办?建议你这么操作!

订套餐容易改套餐难&#xff0c;这种情况你遇到过没有&#xff1f; 有朋友反馈&#xff0c;因为自己的套餐资费太贵&#xff0c;打运营商客服电话降套餐&#xff0c;结果运营商不不能降套餐怎么办&#xff0c;这种情况会怎么办呢&#xff1f; 如果出现以下几种情况&#xff0…

初识C++|继承

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3继承类模板 2. 父类和子类对象赋值兼容转换 3. 继承中的…

Excel单元格操作:读写单元格数据、格式设置与条件格式详解

目录 一、Excel单元格的基本操作 1.1 单元格的选取与编辑 案例一&#xff1a;基本数据录入 1.2 单元格的读取与写入 案例二&#xff1a;使用公式计算销售额 二、单元格格式设置 2.1 字体与颜色设置 案例三&#xff1a;设置标题格式 2.2 数字格式设置 案例四&#xff…