队列 + 宽搜(BFS)

目录

leetcode题目

一、二叉树的层序遍历

二、二叉树的层序遍历 II

三、N叉树的层序遍历

四、二叉树的锯齿形层序遍历

五、二叉树最大宽度

六、在每个树行中找最大值

七、二叉树的层平均值

八、最大层内元素和

九、二叉树的第K大层和

十、反转二叉树的奇数层


leetcode题目

一、二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/

1.题目解析

二叉树的层序遍历

2.算法分析

树的层序遍历是典型要用到队列的场景,因为上一层遍历完之后,遍历下一层是从左到右,也就是要先遍历上一层最左节点的孩子,因此符合先进先出的原则,采用队列!

而题目要求返回二维数组,也就是把每一层遍历的节点放在同一个vector中,可是如何知道每一层的节点个数呢??? 只需要在元素出队列之前用变量记录一下队列当前元素的个数,就是该层节点的数量~

3.算法代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv;
        if(root == nullptr) return vv;
        queue<TreeNode*> q;
        q.push(root);
        
        while(!q.empty())
        {
            int levelSize = q.size();
            vector<int> v;
            while(levelSize--)
            {
                TreeNode* front = q.front();
                q.pop();
                v.push_back(front->val);
                if(front->left)
                    q.push(front->left);
                if(front->right)
                    q.push(front->right);
            }
            vv.push_back(v);
        }
        return vv;
    }
};

二、二叉树的层序遍历 II

107. 二叉树的层序遍历 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/1.题目解析

自底向上层序遍历二叉树

2.算法分析

与题目一解法完全一样,最后将数组逆序一下即可~

3.算法代码

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> vv;
        if(root == nullptr) return vv;
        queue<TreeNode*> q;
        q.push(root);
        
        while(!q.empty())
        {
            int levelSize = q.size();
            vector<int> v;
            while(levelSize--)
            {
                TreeNode* front = q.front();
                q.pop();
                v.push_back(front->val);
                if(front->left)
                    q.push(front->left);
                if(front->right)
                    q.push(front->right);
            }
            vv.push_back(v);
        }
        reverse(vv.begin(), vv.end());
        return vv;
    }
};

三、N叉树的层序遍历

429. N 叉树的层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/n-ary-tree-level-order-traversal/1.题目解析

N叉树的层序遍历

2.算法分析

与二叉树的层序遍历方法完全一致,区别就是一个节点可能有多个孩子,因此上一层出队列带下一层入队列,需要循环遍历把所有的孩子都带进来~

3.算法代码

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.empty())
        {
            int sz = q.size(); 
            vector<int>tmp;
            while(sz--)
            {
                Node* t = q.front(); 
                q.pop();
                tmp.push_back(t->val);
                for(Node* child : t->children) //让下一层节点入队
                {
                    if(child != nullptr)
                       q.push(child);
                }
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};

四、二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/description/1.题目解析

相比之前题目,本题层序遍历是先从左往右,再从右往左,依次类推~

2.算法分析

增加一个标记位,让偶数层的数组逆序即可~

3.算法代码

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) 
    {
        vector<vector<int>> ret;
        if(root == nullptr)
            return ret;
        queue<TreeNode*> q;
        q.push(root);
        int level = 1;
        while(!q.empty())
        {
            int sz = q.size();
            vector<int> tmp;
            while(sz--)
            {
                TreeNode* front = q.front(); 
                q.pop();
                tmp.push_back(front->val);
                if(front->left) 
                    q.push(front->left);
                if(front->right)
                    q.push(front->right);
            }
            //判断是否逆序
            if(level % 2 == 0) 
                reverse(tmp.begin(), tmp.end());
            ret.push_back(tmp);
            level++;
        }    
        return ret;   
    }
};

五、二叉树最大宽度

662. 二叉树最大宽度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-width-of-binary-tree/description/1.题目解析

每一层的宽度指的是某一层最左非空节点和最右非空节点之间的长度~

2.算法分析

二叉树根节点从1开始编号,创建一个队列,队列中存储的是<节点指针,节点编号>, 如果算上空节点的话那么二叉树就是满的,所以如果某个节点编号是x,那么左孩子节点编号是2*x, 右孩子节点编号是2*x+1, 每一层的长度就是 最右节点编号 - 最左节点编号 + 1, 而我们可以直接用vector来模拟队列~

3.算法代码

class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        vector<pair<TreeNode*, unsigned int>> q; //用数组模拟队列
        q.push_back({root, 1});
        unsigned int ret = 0; //统计最大宽度
        while(!q.empty())
        {
            //更新这一层的最大宽度
            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. 在每个树行中找最大值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/find-largest-value-in-each-tree-row/1.题目解析

找到二叉树每一行的最大值了,放在一个数组中,返回数组

2.算法分析

依旧是队列+宽搜,遍历每一层的时候用变量记录一下该层的最大值即可~

3.算法代码

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 sz = q.size();
            int tmp = INT_MIN;
            while(sz--)
            {
                auto 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;
    }
};

七、二叉树的层平均值

637. 二叉树的层平均值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/average-of-levels-in-binary-tree/1.题目解析

求二叉树每一行节点值的平均值,最后返回一个数组

2.算法分析

队列+宽搜,每一行求一下平均值即可~

3.算法代码

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) 
    {
        vector<double> ret;
        if(root == nullptr)
            return ret;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            int sz = q.size();
            double sum = 0;
            for(int i = 0; i < sz; i++)
            {
                auto t = q.front();
                q.pop(); 
                sum += t->val;
                if(t->left) 
                    q.push(t->left);
                if(t->right)
                    q.push(t->right);
            }
            double avg = sum / sz;
            ret.push_back(avg);
        }
        return ret;
    }
};

八、最大层内元素和

1161. 最大层内元素和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-level-sum-of-a-binary-tree/1.题目解析

返回元素和最大的那一层的层号

2.算法分析

队列+宽搜,求一下每一层的和,后续的层和大于之前的层和,就更新结果,同时记录层号

3.算法代码

class Solution 
{
public:
    int maxLevelSum(TreeNode* root) {
        queue<TreeNode*> q;
        q.push(root);

        int ret = INT_MIN;
        int retlevel = 0;
        int level = 1;
        while(!q.empty())
        {
            int sz = q.size();
            int sum = 0;
            while(sz--)
            {
                auto t = q.front();
                q.pop(); 
                sum += t->val;
                if(t->left) 
                    q.push(t->left);
                if(t->right)
                    q.push(t->right);
            }
            if(ret < sum)
            {
                retlevel = level;
                ret = sum;
            }
            level += 1;
        }
        return retlevel;
    }
};

九、二叉树的第K大层和

2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-largest-sum-in-a-binary-tree/1.题目解析

求二叉树的第K大层和,如果k > 树的层数,返回-1

2.算法分析

队列 + BFS + 优先级队列

3.算法代码

class Solution {
public:
    long long kthLargestLevelSum(TreeNode* root, int k) 
    {
        queue<TreeNode*> q;
        q.push(root);
        priority_queue<long long, vector<long long>, less<long long>> heap;
        while(!q.empty())
        {
            int sz = q.size();
            long long sum = 0;
            while(sz--)
            {
                auto t = q.front();
                q.pop();
                sum += t->val;
                if(t->left)
                    q.push(t->left);
                if(t->right)
                    q.push(t->right);
            }
            heap.push(sum);
        }  
        if(k > heap.size())
            return -1;
        while(--k)
            heap.pop();
        return heap.top();
    }
};

十、反转二叉树的奇数层

2415. 反转二叉树的奇数层 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/1.题目解析

将二叉树的奇数层进行反转,本题的根节点认为是第0层

2.算法分析

队列+BFS(宽搜),用level变量记录层数,如果是奇数层就将该层的节点指针插入到一个vector中,遍历完该层之后,将该层进行反转即可~

3.算法代码

class Solution {
public:
    TreeNode* reverseOddLevels(TreeNode* root) 
    {
        queue<TreeNode*> q;
        q.push(root);
        int level = 0;
        vector<TreeNode*> tmp;
        while(!q.empty())
        {
            int sz = q.size();
            while(sz--)
            {
                auto t = q.front();
                q.pop();
                //奇数层的节点指针插入到tmp中
                if(level % 2 == 1)
                    tmp.push_back(t);
                if(t->left)
                    q.push(t->left);
                if(t->right)
                    q.push(t->right);
            }
            //奇数层反转
            if(level % 2 == 1)
            {
                int left = 0, right = tmp.size()-1;
                while(left < right)
                    swap(tmp[left++]->val, tmp[right--]->val);
            }
            tmp.clear();
            level++;
        }
        return root;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销 分析 最值问题——DP 题意分析&#xff1a;从N张票据中选&#xff0c;且总价值不超过M的票据的最大价值&#xff08;背包问题&#xff09; K天限制 一、处理K天限制&#xff1a; 1.对于输入的是月 日的格式&#xff0c;很常用的方式是…

李宏毅-注意力机制详解

原视频链接&#xff1a;attention 一. 基本问题分析 1. 模型的input 无论是预测视频观看人数还是图像处理&#xff0c;输入都可以看作是一个向量&#xff0c;输出是一个数值或类别。然而&#xff0c;若输入是一系列向量&#xff0c;长度可能会不同&#xff0c;例如把句子里的…

【CTF Web】XCTF GFSJ0477 backup Writeup(备份文件+源码泄漏+目录扫描)

backup X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载&#xff1a; http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…

一文读懂 RAG:它将如何重新定义 AI 的未来?

RAG 可以使 LLM 能够在实时请求提供事实信息时&#xff0c;访问外部来源的数据&#xff0c;比如经过审核的数据库或互联网上的信息。这样一来&#xff0c;RAG 就消除了大家对于 LLM 仅依赖其训练数据中获得的内部知识库的顾虑&#xff0c;毕竟&#xff0c;这些知识库可能存在缺…

论文研读 Disentangled Information Bottleneck

解耦信息瓶颈 摘要&#xff1a; 信息瓶颈方法是一种从源随机变量中提取与预测目标随机变量相关的信息的技术&#xff0c;通常通过优化平衡压缩和预测项的IB拉格朗日乘子f来实现&#xff0c;然而拉格朗日乘子很难优化&#xff0c;需要多次实验来调整拉格朗日乘子的值&#xff0c…

【TS】入门

创建项目 vscode自动编译ts 生成配置文件 tsc --init 然后发现终端也改变了&#xff1a;

飞跨电容型的三电平(FC-NPC)逆变器simulink仿真模型

本人搭建了飞跨电容型的三电平逆变器simulink仿真模型&#xff0c;相较于二极管钳位型三电平逆变器而言&#xff0c;钳位二极管变为飞跨的电容。采用SPWM调制和均流均压控制&#xff0c;通过搭建仿真模型得到三电平波形。 三电平拓扑中的飞跨电容是指在电路的输出端使用电容来实…

创建一个即时打印XML报表

即时打印的XML报表不需要创建PLSQL程序包,功能顾问良师益友,写个简单的XML报表还是可以的。 其步骤大致分为如下: 创建XML文档。 创建RTF模板。 创建数据源和上传RTF模板。 创建请求并添加到你需要的请求组。 以下具体说明: 创建XML文档,其包括如下部分: 分别是参数、触…

付费文章合集第二期

☞☞付费文章合集第一期 感谢大家一年来的陪伴与支持&#xff01; 对于感兴趣的文章点标题能跳转原文阅读啦~~ 21、Matlab信号处理——基于LSB和DCB音频水印嵌入提取算法 22、CV小目标识别——AITOD数据集&#xff08;已处理&#xff09; 23、Matlab信号发生器——三角波、…

API低代码平台介绍3-异构数据源的数据查询功能

异构数据源的数据查询功能 在上一篇文章中我们通过API平台定义了一个最基本的数据查询接口&#xff0c;本篇文章我们将上升难度&#xff0c;在原有接口的基础上&#xff0c;实现在MySQL数据库和Oracle数据库同时进行数据查询。   什么场景会需要同时对异构数据源进行查询&…

专业的保密网文件导入导出系统,让文件流转行为更可控安全

军工单位因其涉及国防安全和军事机密&#xff0c;对保密工作有极高的要求&#xff0c;通常会采取严格的网络隔离措施来保护敏感信息和提高网络安全性。常见的方式是通过物理隔离将网络彻底分隔开来&#xff0c;比如保密网和非保密网。网络隔离后&#xff0c;仍有数据交换的需求…

网络加密机的工作原理是什么

网络加密机是一种专用于网络通信加密的硬件设备&#xff0c;其重要性在现代信息技术和网络安全领域愈发凸显。随着网络技术的迅速发展和全球化进程的加快&#xff0c;网络传输的数据量急剧增加&#xff0c;数据安全问题也随之成为了一个亟待解决的问题。网络加密机正是为了解决…

异构图神经网络代码详解与实战

相关代码地址见文末 1.数据读取 数据采用的是电影推荐的数据集,movies.csv文件存储为电影及其题材。 ratings.csv下存储为用户对电影的评分。 数据集的读取流程为: 首先,读取movies.csv并将题材根据词的出现,转换为one-hot编码的形式读取ratings.csv,将movie_id和…

智慧生活:AI工具如何改变我们的工作与生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

TEINet: Towards an Efficient Architecture for Video Recognition 论文阅读

TEINet: Towards an Efficient Architecture for Video Recognition 论文阅读 Abstract1 Introduction2 Related Work3 Method3.1 Motion Enhanced Module3.2 Temporal Interaction Module3.3 TEINet 4 Experiments5 Conclusion阅读总结 文章信息; 原文链接&#xff1a;https:…

【MATLAB源码-第206期】基于matlab的差分进化算法(DE)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 差分进化算法&#xff08;Differential Evolution, DE&#xff09;是一种有效的实数编码的进化算法&#xff0c;主要用于解决实值函数的全局优化问题。本文将详细介绍差分进化算法的背景、原理、操作步骤、参数选择以及实际应…

2024最新从0部署Django项目(nginx+uwsgi+mysql)

云服务器 我这里用的是腾讯云免费试用的2H4Gcentos服务器&#xff08;后升级为2H8G&#xff0c;保险一点提高内存&#xff09; 因为网上很多关于django部属的教程都是宝塔啊&#xff0c;python版本控制器啊这种的&#xff0c;我也误打误撞安装了宝塔面板&#xff0c;但这里我…

vulnhub靶场之FunBox-5

一.环境搭建 1.靶场描述 Lets separate the script-kids from script-teenies.Hint: The first impression is not always the right one!If you need hints, call me on twitter: 0815R2d2 Have fun...This works better with VirtualBox rather than VMwareThis works bett…

39-5 入侵检测系统(IDS)- 安装配置IDS(注意我没安装成功,阅读需谨慎)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

QT学习(1)——创建第一个QT程序,信号和槽,打开关闭窗口的案例

目录 引出规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 打开关闭窗口案例 总结 引出 QT学习&#xff08;1&#…