当前位置: 首页 > news >正文

hot100算法刷题:二叉树的层序遍历

二叉树的层序遍历

使用队列的数据结构实现

思路:

先将根节点入队列,然后不断从队列中取出节点并访问,然后将该节点的左右孩子依次放入队列,重复过程直到队列为空

实现:

用队列q1来遍历,队列的类型为treenode*,

用二维向量v1,报错输出的结果,因为题目中的返回类型就是二维向量。

按层来存储节点的值,也就是每一层的节点值都要存储在一个 vector<int> 里,然后再把这个一维向量添加到二维向量 v1 中。可以借助一个内层循环来处理每一层的节点。

记录当前层的节点数量 int size = q1.size()

遍历for循环,循环次数就是当前层次数size,for循环内部:

获取队首元素,返回给一个current的树节点

队首元素出队

队首元素已经保存到了current中,所以把值加入到当前层中。

判断左右孩子,如果存在,那么入队。

把每一层用1个1维的向量存储:vector currentLevel;

for循环结束,就是一层结束,把当前层加入到结果的二维向量中。即:v1.push_back( currentLevel );

下面是完整的代码:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        // 定义队列,类型要设置为节点treenode类型
        queue<TreeNode*> q1;
        //用向量存储这个输出
        vector<vector<int>> v1;

        //树为空
        if(root == nullptr){
            return v1;
        }
        
        //如果queue是int,则这里要->val,  如果是treenode类型,那么current即可。
        q1.push(root);
        
        //遍历队列,依次出队,然后当前节点左右孩子加入队列
        while(!q1.empty()){
            int size = q1.size();
            vector<int> currentLevel;
            
            //遍历for循环,循环次数就是当前层次数size
            for(int i=0; i<size; i++){
                //取出队首节点
                TreeNode* current = q1.front();
                q1.pop();   //队首节点出队列
                currentLevel.push_back(current->val);   //这里必须是val,因为容器是int

                if(current->left){
                    q1.push(current->left);
                }
                if(current->right){
                    q1.push(current->right);
                }
            }
            v1.push_back(currentLevel);
        }
        return v1;
    }
};  

队列queue

queue的定义方式

方式一: 使用默认的适配器定义队列。

queue<int> q1;

方式二: 使用特定的适配器定义队列。

queue<int, vector<int>> q2;
queue<int, list<int>> q3;

注意: 如果没有为queue指定特定的底层容器,默认情况下使用deque。

queue当中常用的成员函数如下:

成员函数 功能

empty 判断队列是否为空

size 获取队列中有效元素个数

front 获取队头元素

back 获取队尾元素

push 队尾入队列

pop 队头出队列

swap 交换两个队列中的数据

示例:

#include <iostream>
#include <list>
#include <queue>
using namespace std;
int main()
{
        queue<int, list<int>> q;
        q.push(1);
        q.push(2);
        q.push(3);
        q.push(4);
        cout << q.size() << endl; //4
        while (!q.empty())
        {
                cout << q.front() << " ";
                q.pop();
        }
        cout << endl; //1 2 3 4
        return 0;
}

相关文章:

  • Spring Boot 核心知识点深度详解:自动化配置 (Auto-configuration) - 解锁 Spring Boot 的 “魔法”
  • 远程访问家里电脑上部署的Stable diffusion - 免费篇
  • error: Microsoft Visual C++ 14.0 or greater is required解决不需要安装到c盘等
  • Mybatis使用Druid连接池
  • 0x04.若依框架微服务开发(含AI模块运行)
  • Kotlin 中 let 方法的作用和使用场景
  • 人工智能助力家庭机器人:从清洁到陪伴的智能转型
  • ngx_http_conf_ctx_t
  • 【源码分析】Nacos实例注册流程分析-事件驱动框架
  • react实现虚拟列表
  • C#语法基础总结
  • C语言刷题第六章(下)
  • 神策数据接入 DeepSeek,AI 赋能数据分析与智能运营
  • 【华为OD-E卷 -122 字符统计及重排 100分(python、java、c++、js、c)】
  • repo init 错误 Permission denied (publickey)
  • 算法刷题记录——LeetCode篇(4) [第301~400题](持续更新)
  • CI/CD构建与注意事项
  • Vue3-高级特性
  • 【微服务】如何用Azure容器应用Job处理异步HTTP API请求
  • docker安装redis
  • 铁路上海站迎五一假期客流最高峰,今日预计发送77万人次
  • 马上评|扩大高速免费救援范围,打消出行后顾之忧
  • 耶路撒冷发生山火,以防长宣布紧急状态
  • 澎湃回声丨23岁小伙“被精神病”8年续:今日将被移出“重精”管理系统
  • 迎接八方来客:全国多地“五一”假期党政机关大院停车场免费开放
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动