C++ 队列

news2024/10/5 14:32:35

目录

队列的应用场景 

1、429. N 叉树的层序遍历

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

3、662. 二叉树最大宽度

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


队列的应用场景 

  1. 广度优先搜索(BFS):队列是广度优先搜索算法的核心数据结构。在BFS中,我们从根节点开始,逐层地访问节点,首先访问根节点,然后访问其所有直接子节点,然后是子节点的子节点,以此类推。队列用于按照层级顺序存储待访问的节点,确保先访问上一层的节点,然后再访问下一层的节点。

  2. 树的层次遍历:在树的层次遍历算法中,队列用于按层级顺序存储待访问的节点。这样可以确保先访问上一层的节点,然后再访问下一层的节点。

1、429. N 叉树的层序遍历

思路:队列实现广度优先搜索(dfs)。


/*
// 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) {
        vector<vector<int>> ret;//存储返回结果
        queue<Node*> q;
        if (root == nullptr)//处理空树
            return ret;
        q.push(root);
        while (q.size()) {//某层元素个数为0则结束
            vector<int> tmp;//暂存当前层的元素
            int n = q.size();
            for (int i = 0; i < n; i++) {//循环处理当前层
                Node* s = q.front();
                q.pop();//弹出队列
                tmp.push_back(s->val);//存入暂存数组
                
                //每处理完一个元素,它的孩子节点需要入队列
                for (Node* child : s->children) {/
                    if (child != nullptr)
                        q.push(child);
                }
            }
            ret.push_back(tmp);//存入当前层的结果
        }
        return ret;
    }
};

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

 思路:队列实现广度优先搜索(dfs),偶数层进行逆置即可实现锯齿形层序遍历。

/**
 * 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) {
        vector<vector<int>> ret;
        if (root == nullptr)
            return ret;
        queue<TreeNode*> q;
        int level = 1;
        q.push(root);
        while (q.size()) {
            int sz = q.size();
            vector<int> tmp;
            for (int i = 0; i < sz; i++) {
                TreeNode* t = q.front();
                q.pop();
                tmp.push_back(t->val);
                if (t->left)
                    q.push(t->left);
                if (t->right)
                    q.push(t->right);
            }
            if (level % 2 == 0)
                reverse(tmp.begin(), tmp.end());
            ret.push_back(tmp);
            level++;
        }
        return ret;
    }
};

3、662. 二叉树最大宽度

思路:数组模拟二叉树建堆思路,使用数组或队列统计下标并计算差值即可。

题中说题目数据保证答案将会在  32 位 带符号整数范围内,所以使用unsigned int存储下标差值。

/**
 * 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;
        unsigned int ret = 0;
        q.push_back({root, 1});
        while (q.size()) {
            auto& x = q.front();
            auto& y = q.back();
            ret = max(ret, y.second - x.second + 1);
            vector<pair<TreeNode*, unsigned int>> tmp;//存储下一层
            for (auto& x : q) {
                if (x.first->left)
                    tmp.push_back({x.first->left, x.second * 2});
                if (x.first->right)
                    tmp.push_back({x.first->right, 2 * x.second + 1});
            }
            q = tmp;//更新为下一层
        }
        return ret;
    }
};

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

 思路:队列实现广度优先搜索(dfs)。

/**
 * 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.size()) {
            int sz = q.size();
            int tmp = INT_MIN;
            for (int i = 0; i < sz; i++) {//便利当前层
                TreeNode* t = q.front();
                q.pop();
                tmp = max(tmp, t->val);//记录当前层最大值
                //更新当前元素的子节点到队列
                if (t->left)
                    q.push(t->left);
                if (t->right)
                    q.push(t->right);
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};

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

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

相关文章

如何将应用一键部署至多个环境?丨Walrus教程

在 Walrus 平台上&#xff0c;运维团队在资源定义&#xff08;Resource Definition&#xff09;中声明提供的资源类型&#xff0c;通过设置匹配规则&#xff0c;将不同的资源部署模板应用到不同类型的环境、项目等。与此同时&#xff0c;研发人员无需关注底层具体实现方式&…

Redis精讲

redis持久化 RDB方式 Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中. 快照文件称为RDB文件, 默认是保存在当前运行目录. [rootcentos-zyw ~]# docker exec -it redis redis-cli 127.0.0.1:6379> sav…

02- 使用Docker安装RabbitMQ

使用Docker安装RabbitMQ 下载安装镜像 方式一: 启动docker服务,然后在线拉取 # 在线拉取镜像 docker pull rabbitmq:3-management# 使用docker images查看是否已经成功拉取方式二: 从本地加载 ,将RabbitMQ上传到虚拟机中后使用命令加载镜像即可 docker load -i mq.tar启动M…

你必须要知道外贸独立站的那些事

导语 独立站&#xff0c;顾名思义就是具有独立域名的网站。对于跨境电商来说&#xff0c;独立站就是让他们脱离第三方束缚的一个平台。 简单来说就是自己建立一个属于自己的电商平台&#xff0c;然后上传商品出售&#xff0c;但是需要自己去做营销、做推广。 一、自建独立站的好…

运维工具之ventoy安装及使用简介

一、Ventoy简介 简单来说&#xff0c;Ventoy是一个制作可启动U盘的开源工具。有了Ventoy你就无需反复地格式化U盘&#xff0c;你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。你可以一次性拷贝很多个不同类型的镜像文…

Redis核心数据结构之跳跃表

跳跃表 概述 跳跃表(skiplist)是一种有序数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找&#xff0c;还可以通过顺序性操作来批量处理节点。在大部分情况下&am…

基于PHP构建的HTML5点餐系统的设计13.91

随着互联网时代的发展&#xff0c;人们的生活方式正在发生改变。传统的餐饮行业也正在发生变革。人们不再满足过去的点餐方式&#xff0c;需要更好的体验。本课题旨在结合点餐系统的技术优势&#xff0c;设计一个能够方便顾客与商家&#xff0c;并且节约人力成本以及可以很好地…

访问一次网站的全过程

目录 流程图&#xff1a; 一、应用层开始 1. 在浏览器输入https://www.baidu.com 2. DNS获取IP地址 3. 根据HTTP协议生成HTTP请求报文 应用层结束 二、传输层开始 4. TCP三次握手 传输层结束 三、网络层开始 5. IP寻址 6. ARP协议获取MAC地址 网络层结束 四、数据…

Modified Bessel Function of the First Kind

Abstract 最近接触到 von Mises–Fisher distribution, 其概率密度如下: f p ( x ; μ , κ ) κ p 2 − 1 ( 2 π ) p 2 I p 2 − 1 ( κ ) e κ μ ⊺ x \begin{aligned} f_{p}(\bm{x}; \bm{\mu}, \kappa) \frac{\kappa^{\frac{p}{2}-1}} {(2\pi)^{\frac{p}{2}} I_{\frac…

linux系统下,配置开机自启脚本常见的5种方法

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:linux基础与进阶,shell脚本编写实战 景天的主页:景天科技苑 文章目录 linux下设置开机自动运行脚本的5种方法一、编辑/etc/rc.d/rc.local文件1、在自己需要启动的文件目录中编写一个…

CPU独占内核运行方式实现,并指定线程到特定CPU上执行

CPU独占内核运行方式实现&#xff0c;并指定线程到特定CPU上执行1. 隔离指定的CPU,避免其余线程run在被隔离的CPU上2. 绑定所有的interrupts&#xff08;中断&#xff09;到非隔离的CPU上,避免被隔离的CPU收到interrupt.3. C绑定线程运行在指定CPU也可以通过taskset来使线程/进…

一文详解WebView,不好理解就想想iframe,类比后秒懂了。

Hi&#xff0c;我是贝格前端工场&#xff0c;又到了给大家做技术扫盲的时候&#xff0c;本文讲一讲webview&#xff0c;有些老铁觉得很难懂&#xff0c;其实借助iframe来中转一下&#xff0c;就好理解了。 WebView是一种用于在应用程序中显示Web内容的组件。它可以嵌入到应用程…

免费、好用、强大的轻量级笔记软件评测

在我们不断寻找能提高个人和团队效率的工具的过程中&#xff0c;优质的笔记软件扮演着至关重要的角色。本文将介绍几款经过精选的免费且功能强大的笔记应用&#xff0c;这些应用不仅适合个人记录和整理思维&#xff0c;也适合团队合作和信息共享。 Joplin —— 隐私保护的开源…

京东按关键字搜索商品 API 返回值说明

京东按关键字搜索商品的API返回值说明如下&#xff1a; 总记录数&#xff08;total_count&#xff09;&#xff1a;搜索结果的总数量。当前页码&#xff08;page_no&#xff09;&#xff1a;当前请求的页码。每页记录数&#xff08;page_size&#xff09;&#xff1a;每页显示…

蓝桥杯倒计时 36天-DFS练习

文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路&#xff1a;贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小&#xff0c;可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…

Elasticsearch:机器学习与人工智能 - 理解差异

作者&#xff1a;来自 Elastic Aditya Tripathi, Jessica Taylor 长期以来&#xff0c;人工智能几乎完全是科幻小说作家的玩物&#xff0c;人类将技术推得太远&#xff0c;以至于它变得活跃起来 —— 正如好莱坞让我们相信的那样 —— 开始造成严重破坏。 令人愉快的东西&#…

保护图纸不能打印,加密图纸如何加密只能看,不能打印复制

图纸是表达设计思想、传递产品信息、交流产品构思的最重要的工具&#xff0c;是企业中最重要的技术资料。 图纸作为企业重要的技术资料&#xff0c;包含了产品的核心设计、制造工艺、材料选择等关键信息。 那么&#xff0c;如何才能保护图纸呢&#xff1f; 首先&#xff0c;我…

Covalent(CQT)降低数据可用性成本,加快 Layer2 在 Web3 领域的扩张

Covalent Network&#xff08;CQT&#xff09;通过其统一 API&#xff0c;正在为 EVM Layer2 生态系统提供支持&#xff0c;减少了开发者需要导航多个数据供应商的需求&#xff0c;通过解决多链环境中的碎片化挑战&#xff0c;极大地提高了他们的效率。 通过其统一 API 支持 2…

静态源代码安全扫描工具测评结果汇总

测评背景 随着数字技术的进步&#xff0c;网络安全行业日益发展&#xff0c;企业对于DevSecOps的应用和落地的需求日益增加&#xff0c;静态源代码安全扫描工具已成为其中的关键产品或工具。同时&#xff0c;在代码安全审计或检测过程中&#xff0c;也需要选择一款合适的、好用…

动态代理详解(原理+代码+代码解析)

动态代理 1.什么是动态代理&#xff1f; 动态代理是一种在运行的时候动态的生成代理对象的技术。它在不改变原始类的情况下&#xff0c;对原始类的方法进行拦截或者增强。 2.动态代理可以实现的功能&#xff1f; 使用动态代理可以实现如下常用功能&#xff1a; 1.AOP&#x…