【LeetCode】树的BFS(层序遍历)精选6题

news2025/1/13 8:04:32

目录

1. N 叉树的层序遍历(中等)

2. 二叉树的锯齿形层序遍历(中等)

3. 二叉树的最大宽度(中等)

4. 在每个树行中找最大值(中等)

5. 找树左下角的值(中等)

6. 二叉树的右视图(中等)


1. N 叉树的层序遍历(中等)

先让根结点root入队,队列中:①

第一层遍历:让①出队,让①的孩子③②④入队,队列中:③②④

第二层遍历:让③②④出队,让③的孩子⑤⑥入队(②④没有孩子),队列中:③②④⑤⑥

第三层遍历:让⑤⑥出队,⑤⑥没孩子。

队列为空,层序遍历结束。

代码流程设计:先让根节点入队。然后在每一轮层序遍历中,计算当前队列中节点的个数(即本层节点的个数),记为count,依次让count个节点出队,把本层节点的值放到临时数组中,并让本层节点的孩子(即下一层节点)入队。该轮层序遍历完成后,把临时数组添加到答案中。

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        if (root == nullptr)
            return {};

        vector<vector<int>> ans;

        queue<Node*> q;
        q.push(root);
        while (!q.empty())
        {
            int count = q.size(); // 本层节点的个数
            vector<int> tmp; // 记录本层节点的值
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                Node* cur = q.front();
                q.pop();
                // 把本层节点的值放入临时数组中
                tmp.push_back(cur->val);
                // 本层节点的孩子(下一层节点)入队
                for (auto& child : cur->children)
                {
                    if (child != nullptr)
                    {
                        q.push(child);
                    }
                }
            }
            ans.push_back(tmp);
        }
        return ans;
    }
};

2. 二叉树的锯齿形层序遍历(中等)

创建一个变量level表示层数,假设二叉树从第1层开始。level为奇数,正序遍历;level为偶数,逆序遍历。

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if (root == nullptr)
            return {};

        vector<vector<int>> ans;
        int level = 1;

        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty())
        {
            int count = q.size(); // 本层节点的个数
            vector<int> tmp; // 记录本层节点的值
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                TreeNode* cur = q.front();
                q.pop();
                // 把本层节点的值放入临时数组中
                tmp.push_back(cur->val);
                // 本层节点的孩子(下一层节点)入队
                if (cur->left)
                {
                    q.push(cur->left);
                }
                if (cur->right)
                {
                    q.push(cur->right);
                }
            }
            // 如果本层是偶数层,将临时数组反转,再放入答案中
            if (level % 2 == 0)
            {
                reverse(tmp.begin(), tmp.end());
            }
            ans.push_back(tmp);
            level++;
        }
        return ans;
    }
};

3. 二叉树的最大宽度(中等)

利用二叉树的顺序存储方式给二叉树的节点编号,假设根结点编号为1,编号为x的节点的两个孩子的编号分别为2x和2x+1。让节点和编号一起入队,每层宽度 = 队尾编号 - 队头编号 + 1。

代码流程设计:先让根节点入队。然后在每一轮层序遍历中,计算本层宽度并更新答案,计算当前队列中节点的个数(即本层节点的个数),记为count,依次让count个节点出队,并让本层节点的孩子(即下一层节点)入队。

如果二叉树的层数非常非常非常多时,任何一种数据类型都存不下编号。因为无符号整型溢出时会自动取模,而且题目数据保证答案将会在32位带符号整数范围内,所以用unsigned int存储编号就可以保证答案正确。

class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        unsigned int ans = 0;

        queue<pair<TreeNode*, unsigned int>> q;
        q.push({root, 1});
        while (!q.empty())
        {
            unsigned int width = q.back().second - q.front().second + 1; // 本层宽度
            ans = max(ans, width);
            int count = q.size(); // 本层节点的个数
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                TreeNode* cur = q.front().first;
                unsigned int num = q.front().second; // cur的编号
                q.pop();
                // 本层节点的孩子(下一层节点)入队
                if (cur->left)
                {
                    q.push({cur->left, 2 * num});
                }
                if (cur->right)
                {
                    q.push({cur->right, 2 * num + 1});
                }
            }
        }
        return ans;
    }
};

4. 在每个树行中找最大值(中等)

层序遍历的过程中找最大值。

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        if (root == nullptr)
            return {};

        vector<int> ans;

        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty())
        {
            int count = q.size(); // 本层节点的个数
            int tmp = INT_MIN;
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                TreeNode* cur = q.front();
                q.pop();
                // 更新tmp
                tmp = max(tmp, cur->val);
                // 本层节点的孩子(下一层节点)入队
                if (cur->left)
                {
                    q.push(cur->left);
                }
                if (cur->right)
                {
                    q.push(cur->right);
                }
            }
            ans.push_back(tmp);
        }
        return ans;
    }
};

5. 找树左下角的值(中等)

层序遍历的过程中找最左边的值。

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        if (root == nullptr)
            return {};

        int ans = 0;

        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty())
        {
            int count = q.size(); // 本层节点的个数
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                TreeNode* cur = q.front();
                q.pop();
                // 如果遍历到本层最左边的节点,更新ans
                if (i == 0)
                {
                    ans = cur->val;
                }
                // 本层节点的孩子(下一层节点)入队
                if (cur->left)
                {
                    q.push(cur->left);
                }
                if (cur->right)
                {
                    q.push(cur->right);
                }
            }
        }
        return ans;
    }
};

6. 二叉树的右视图(中等)

层序遍历的过程中找最右边的值。

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        if (root == nullptr)
            return {};

        vector<int> ans;

        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty())
        {
            int count = q.size(); // 本层节点的个数
            for (int i = 0; i < count; i++)
            {
                // 本层节点出队
                TreeNode* cur = q.front();
                q.pop();
                // 如果遍历到本层最右边的节点,将值添加到答案
                if (i == count - 1)
                {
                    ans.push_back(cur->val);
                }
                // 本层节点的孩子(下一层节点)入队
                if (cur->left)
                {
                    q.push(cur->left);
                }
                if (cur->right)
                {
                    q.push(cur->right);
                }
            }
        }
        return ans;
    }
};

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

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

相关文章

2024.2.20

使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {char str[100]"";puts("please input str:");//从终端读…

手动实现new操作符

<script>//前置知识// 每一个函数在创建之初就会有一个prototype属性&#xff0c;这个属性指向函数的原型对象// function abc(){// }// abc.prototype--> {constructor: f}// 在JS中任意的对象都有内置的属性叫做[[prototype]]这是一个私有属性&#xff0c;这个私有属…

GEE数据集——美国两个主要石油和天然气(OG)产区内与石油和天然气(OG)相关的基础设施的位置

该数据集提供了美国两个主要石油和天然气&#xff08;O&G&#xff09;产区内与石油和天然气&#xff08;O&G&#xff09;相关的基础设施的位置&#xff1a;德克萨斯州西部和新墨西哥州南部二叠纪盆地的特拉华子盆地以及犹他州的乌因塔盆地。前言 – 人工智能教程 石油…

deep learning 代码笔记

1. pandas数据读取和预处理 # import pandas and load dataset import pandas as pd names [Sex, Length, Diameter, Height, Whole_weight, Shucked_weight, Viscera_weight, Shell_weight, Rings] data pd.read_csv(data_file, headerNone, namesnames) print(data) …

【前沿】头戴式光场显示技术研究进展

摘要&#xff1a;光场显示器旨在通过重建三维场景在不同方向发出的几何光线来渲染三维场景的视觉感知&#xff0c;从而为人的视觉系统提供自然舒适的视觉体验&#xff0c;解决传统平面立体三维显示器中的聚散调节冲突问题。近年来&#xff0c;多种光场显示方法被尝试应用到头戴…

沁恒CH32V30X学习笔记11---使用外部时钟模式2采集脉冲计数

使用外部时钟模式2采集脉冲计数 使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或下降沿计数。将 ECE 位置位时,将使用外部时钟源模式 2。使用外部时钟源模式 2 时,ETRF 被选定为 CK_PSC。ETR 引脚经过可选的反相器(ETP),分频器(ETPS)后成为 ETRP,再经过滤波…

Stable Diffusion——stable diffusion基础原理详解与安装秋叶整合包进行出图测试

前言 在2022年&#xff0c;人工智能创作内容&#xff08;AIGC&#xff09;成为了AI领域的热门话题之一。在ChatGPT问世之前&#xff0c;AI绘画以其独特的创意和便捷的创作工具迅速走红&#xff0c;引起了广泛关注。随着一系列以Stable Diffusion、Midjourney、NovelAI等为代表…

【Linux权限】 Linux权限管理 | 粘滞位

文章目录 Linux权限管理什么是权限 ❓&#x1f4a6; 文件访问者的分类(人)&#x1f4a6; 文件类型和访问权限(事物属性) &#x1f4a6; 文件访问权限的相关设置方法目录的权限 粘滞位 Linux权限管理 什么是权限 ❓ 权限本质上是决定某件事情&#xff0c;某人能否做。 Linux下…

【GameFramework框架内置模块】2、数据节点(Data Node)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

AMD FPGA设计优化宝典笔记(1)触发器

高亚军老师的这本书《AMD FPGA设计优化宝典》&#xff0c;他主要讲了两个东西&#xff1a; 第一个东西是代码的良好风格&#xff1b; 第二个是设计收敛等的本质。 这个书的结构是一个总论&#xff0c;加上另外的9个优化&#xff0c;包含的有&#xff1a;时钟网络、组合逻辑、触…

从starrocks安装说起和Oracle的OLAP殊途同归

StarRocks是一款分析型数据库&#xff08;他的定语也很多&#xff0c;分布式存算分离等等&#xff09;。作为数据库他的运行和维护迟早也是落在我这里的。对于做数据库的人都知道什么是交易型数据库&#xff0c;什么是分析型数据库。以及什么是事务分析混合型数据库。但是对于非…

UE5 C++ 静态加载资源和类

一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件&#xff0c;现在在组件中赋值。使用static ConstructorHelpers::FObjectFinder<T>TempName(TEXT("Copy Reference"))&#xff1b;再用TempName.Object //静态加载资源static ConstructorHelpers::FOb…

2024.2.10 HCIA - Big Data笔记

1. 大数据发展趋势与鲲鹏大数据大数据时代大数据的应用领域企业所面临的挑战和机遇华为鲲鹏解决方案2. HDFS分布式文件系统和ZooKeeperHDFS分布式文件系统HDFS概述HDFS相关概念HDFS体系架构HDFS关键特性HDFS数据读写流程ZooKeeper分布式协调服务ZooKeeper概述ZooKeeper体系结构…

拿捏c语言指针(下)

前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针&#xff08;上&#xff09;和 拿捏c语言指针&#xff08;中&#xff09; ​​​​​​没有看的小伙伴要抓紧喽~ 欢迎关注​​个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#x…

GNU 图像处理程序 (GIMP) - 颜色拾取工具

GNU 图像处理程序 [GIMP] - 颜色拾取工具 References 选择 颜色拾取工具 在图片上选取要拾取位置的颜色&#xff0c;前景颜色会跟着改变 选择画笔工具&#xff0c;在图片上绘制的是选取的颜色 工具选项 -> 设置背景颜色&#xff0c;在图片上拾取为背景颜色 使用 橡皮工具&am…

SQL Developer 小贴士:显示Trace文件

SQL Developer可以识别trace文件&#xff0c;而无需利用tkprof进行转换。 在数据库服务器上生产trace文件。例如&#xff1a; alter session set tracefile_identifierdemo01_02;alter session set sql_tracetrue;-- your SQL here, for example select * from hr.employees;a…

汽车电子论文学习--电动汽车电机驱动系统动力学特性分析

关键重点&#xff1a; 1. 汽车的低速转矩存在最大限制&#xff0c;受附着力限制&#xff0c;因路面不同而变化。 2. 起步加速至规定转速的时间可以计算得到&#xff1a; 3. 电机额定功率的计算方式&#xff1a; 可以采取最高设计车速90%或120km/h匀速行驶的功率作为电机额定功…

LeetCode94.二叉树的中序遍历

题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 &#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 思路 中序遍历的顺序是左子树 -> 根节点 -> 右子树。因此&#xff0c;我们可以通过递归的方式遍历二叉树&…

程序员为什么不喜欢关电脑?没有的事!

程序员为什么不喜欢关电脑&#xff1f; 我干程序员 10 年了&#xff0c;这些年确实不怎么关电脑。不过我感觉这个习惯跟程序员这个职业是无关的&#xff0c;假如我今天不干程序员&#xff0c;我估计也照样不关电脑。其实&#xff0c;我们不妨反过来问&#xff0c;你喜欢关电脑…

美容小程序:让预约更简单,服务更贴心

在当今繁忙的生活节奏中&#xff0c;美容预约常常令人感到繁琐和疲惫。为了解决这个问题&#xff0c;许多美容院和SPA中心已经开始采用美容小程序来简化预约流程&#xff0c;并提供更加贴心的服务。在这篇文章中&#xff0c;我们将引导您了解如何制作一个美容小程序&#xff0c…