队列 + 宽搜(BFS)

news2024/11/18 3:01:21

目录

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;
    }
};

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

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

相关文章

mac第三方软件怎么删除 MacBook卸载第三方应用程序 mac第三方恶意软件删除不了怎么办呢

Mac是一款优秀的个人电脑&#xff0c;它拥有流畅的操作系统、强大的性能和丰富的应用程序。但是&#xff0c;随着使用时间的增加&#xff0c;你可能会发现你的Mac上安装了一些不需要或者不喜欢的第三方软件&#xff0c;这些软件可能会占用你的空间、影响你的速度或者带来安全风…

Android 简单的下拉选择框实现

要实现这种效果,目前知道的方法有以下两种,Spinner 和 ListPopupWindow,当然肯定还有很多别的方法,这里我们先尝试使用ListPopupWindow来实现这个效果; 以下是一个简单的demo: public class MainActivity extends AppCompatActivity {private List<String> dataList;pr…

DDM-MIMO-FMCW雷达MATLAB仿真

本文在前期TDM和BPM体制的基础上&#xff0c;仿真DDM体制下的调制解调和信号处理测距、测速、测角流程。 TDM和BPM相关可以看这两篇博文TDM(BPM)-MIMO-FMCW雷达仿真-CSDN博客&#xff0c;确定性最大似然&#xff08;DML&#xff09;估计测角-CSDN博客TDM(BPM)-MIMO-FMCW雷达仿真…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷3(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

Python中tkinter编程入门3

在使用tkinter创建了窗口之后&#xff0c;可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤&#xff0c;一是创建标签控件&#xff0c;二是将创建好的标签“放置”到窗口上。 1.1 创建标签…

[数据集][目标检测]管道焊缝质量检测数据集VOC+YOLO格式1134张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1134 标注数量(xml文件个数)&#xff1a;1134 标注数量(txt文件个数)&#xff1a;1134 标注…

【pandas】库中的apply(lambda function ,arix)

pandas.apply() 遍历DataFrame的元素&#xff08;一行或者一列数据&#xff09; 行遍历&#xff1a;axis 1 列遍历&#xff1a;axis 0 基础信息 pandas的apply()方法是用来调用一个lambda函数&#xff0c;让函数对数据对象具有批处理的特性。 pandas支持apply()调用…

钉钉群定时发送消息1.0软件【附源码】

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 有时候需要在钉钉群里提醒一些消息。要通知的群成员又不方便用定时钉的功能&#xff0c;所以写了这么一个每日定时推送群消息的工具。 易语言程序&#xff0c;附上源码与模块&#x…

cubic 相比 bbr 并非很糟糕

迷信 bbr 的人是被它的大吞吐所迷惑&#xff0c;我也不想再解释&#xff0c;但我得反过来说一下 cubic 并非那么糟。 想搞大吞吐的&#xff0c;看看我这个 pixie 算法&#xff1a;https://github.com/marywangran/pixie&#xff0c;就着它的思路改就是了。 cubic 属于 aimd-ba…

最新ChatGPT中文系统网站源码+系统部署+支持AI对话、AI绘画、AI音乐等大模型

一、系统介绍 本文将介绍最新的ChatGPT中文版AI创作系统——星河易创AI系统&#xff0c;该系统基于ChatGPT的核心技术&#xff0c;融合了自然语言问答、绘画、音乐等创作功能&#xff0c;并兼容官方GPT全模型。该系统提供多样化的应用&#xff0c;包括GPTs的多场景应用、实时G…

Python快速入门-零基础也能掌握的编程技巧,基础方法和API整理

目录 前言 数据结构 数字 数学运算 随机数 字符串 列表 元组 字典 面向对象 JSON 文件操作 扩展 制作一个简易时钟 前言 环境什么就不在赘述&#xff0c;可以参考其他文章&#xff0c;也可以在线运行 CSDN在线运行地址&#xff1a;InsCode - 让你的灵感立刻落地…

n5.树(中)

1、二叉树的遍历 1.1先序、中序、后序遍历 先序遍历 根->左->右 先序遍历先访问根节点&#xff0c;再访问它的左子树&#xff0c;然后访问它的右子树。对于每次访问到的结点&#xff0c;都要递归地访问左子树、后右子树———递归。 创建 typedef struct TreeNode*…

理解导数(x^n求导后nx^n-1)

以下都是为了方便理解 微小量是 t M(x)是一个函数 M 在 x 处的斜率 M 在 x 处的导数 垂直距离 平移距离 M ( x t ) − M ( x ) ( x t ) − x M在x处的斜率 M在x处的导数 \dfrac{垂直距离}{平移距离} \dfrac{M\left( xt\right) -M\left( x\right) }{(x t) -x} M在x处的斜…

Tiff文件解析和PackBits解压缩

实现了Tiff图片文件格式的解析&#xff0c;对Tiff文件中的PackBits压缩格式进行解压缩&#xff0c;对Tiff文件中每一个Frame转换成BufferedImage显示。 Java语言实现&#xff0c;Eclipse下开发&#xff0c;AWT显示图片。 public static TIFF Parse(final byte[] bytes) throw…

618洗地机推荐,市面上各式各样的洗地机怎么选?这里有答案

洗地机的出现极大地改变了清洁方式&#xff0c;通过结合扫地、拖地、吸尘等多种功能&#xff0c;实现了一机多用的便捷清洁体验。而且洗地机不需要弯腰&#xff0c;每次也不用清洁很长时间&#xff0c;节省出来的时间可以更好的休息&#xff0c;但是市面上各式各样的洗地机怎么…

突破编程界限:探索AI编程新境界

文章目录 一、AI编程助手1.1 Baidu Comate智能代码助手1.2 阿里云 通义灵码 二、场景需求三、体验步骤3.1 官网下载3.2 手动下载 四、试用感受4.1 提示4.2 注释生成代码4.3 代码生成4.4 选中生成注释4.5 查看变更&新建文件4.6 调优建议4.7 插件使用 五、结尾推荐 一、AI编程…

代码审计-php篇之某CRM系统多处sql注入

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;3516 阅读时间: 35min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果…

Python爬虫 【1】 —— 爬虫基础

爬虫基本套路 基本流程 目标数据来源地址结构分析 具体数据在哪&#xff08;网站 还是APP&#xff09;如何展示的数据、 实现构思操刀编码 基本手段 破解请求限制 请求头设置&#xff0c;如&#xff1a;useragent为有效客户端控制请求频率&#xff08;根据实际情境&#xff09…

在Linux上安装并运行RabbitMQ

目录 准备CentOS服务器 下载rabbit-server和erlang文件 启动RabbitMQ服务 准备CentOS服务器 两个命令&#xff0c;选一个能用的&#xff0c;查看CentOS服务器的版本 lsb_release -a下载rabbit-server和erlang文件 参考文章&#xff1a;http://t.csdnimg.cn/t8BbM 1、创建新…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…