【宽搜】1. 层序遍历模板讲解

news/2024/10/4 14:14:56 标签: c++, leetcode

题目描述

题目链接:N叉树的层序遍历
在这里插入图片描述

层序遍历流程

请仔细阅读下图:
在这里插入图片描述
根据上图的流程,下面再明确几个问题:
1. 为什么要使用队列?

队列是先进先出的数据结构,在数的层序遍历中,需要先将节点push进来,最终将节点先pop出去,这符合队列的特性

2. 如何控制将每一层的元素push进队列并最终加入到vector中?

将A节点pop出队列的时候就将A的孩子push进队列。这样当A节点这一层都pop出队列的时候A节点的下一层就全部进入到队列中了。队列的size就是这一层的节点个数。当遍历完size时,就说明这一层都遍历完了,此时就可以将已经装好这一层元素的vector push_back()进vector<vector< int >>中了。

代码

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
      vector<vector<int>> res;
      queue<Node*> q;

      if (root == nullptr)
      {
        return res;
      }

      q.push(root);

      while(q.size())
      {
        //这两个值在这里定义是因为每一层都需要重新定义,会变化
        vector<int> tmp;
        int sz = q.size();   //记录q的size,其实就是数的每一层的节点个数

        //这里是对数的每一层进行操作了
        for (int i = 0; i < sz; ++ i)
        {
            Node* t = q.front();
            //将t从队列中pop出去
            q.pop();
            //同时将这一层的元素一个一个都push_back()进vector中
            tmp.push_back(t->val);

            //t的孩子都push进队列中 --> 因为push和pop都会影响到队列的size
            //如果前面不将当时的size保存到sz中,会出现混乱的问题
            for (Node* child : t->children)
            {   
                if (child != nullptr)
                    q.push(child);
            }
        }

        //走到这里,说明数的一层遍历完了
        //将这一层的节点的值push_back()到vector<cevtor<int>>中
        res.push_back(tmp);
      }

      return res;
    }
};

这个代码就是层序遍历的模板,层序遍历就用这个模板就行了。然后根据不同的题目进行简单的改变。
在这里插入图片描述


http://www.niftyadmin.cn/n/5690013.html

相关文章

Spring Boot新闻推荐系统设计与实现

3系统分析 3.1可行性分析 通过对本新闻推荐系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻推荐系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

IPsec手动方式

文章目录 实验要求实验配置 实验要求 配置 IPsec vpn 采用手动方式同时要满足上网和VPN两种需求使用NAT进行地址映射认证方法和加密算法自行配置采用安全的方法 实验配置 R1&#xff1a; #基本配置sy sy R1 dhcp enable acl 2000 rule permit sour 192.168.1.0 0.0.0.255 int…

【一文理解】conda install pip install 区别

大部分情况下&#xff0c;conda install & pip install 二者安装的package都可以正常work&#xff0c;但是混装多种package后容易版本冲突&#xff0c;出现各种报错。 目录 检查机制 支持语言 库的位置 环境隔离 编译情况 检查机制 conda有严格的检查机制&#xff0c…

SpringMVC2~~~

数据格式化 提交数据(比如表单)&#xff0c;对提交的数据进行转换和处理 基本数据类型可以和字符串自动转换 <a href"<%request.getContextPath()%>/addMonsterUI">添加妖怪</a> Controller Scope(value "prototype") public class …

Lua语言中函数的二进制码保存与查看

在Lua编程语言中&#xff0c;函数&#xff08;function&#xff09;和表&#xff08;table&#xff09;、线程&#xff08;thread&#xff09;等一样&#xff0c;都是变量[1]。而函数&#xff0c;本质上就是一个程序&#xff0c;所以是可以以二进制码的形式表达的。本文介绍如何…

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

影刀---如何进行自动化操作

本文不是广告&#xff0c;没有人给我宣传费&#xff0c;只是单纯的觉得这个软件很好用 感谢大家的多多支持哦 本文 1.基本概念与操作&#xff08;非标准下拉框和上传下载&#xff09;非标准对话框的操作上传对话框、下载的对话框、提示的对话框 2.综合案例3.找不到元素怎么办&a…

win11/win10/windows下快安装并使用git

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Git 的特点&#xff1f;二、GIT安装方法1.打开GIT官网2.下载git安装程序整个安装过程基本上直接用默认选项就可以 总结 前言 提示&#xff1a;GIT介绍 GI…