【力扣】二叉树的分层遍历1和2

news2024/10/7 9:25:59

在这里插入图片描述

二叉树的分层遍历1

链接:二叉树的分层遍历1

首先,我们需要知道什么是二叉树的层序遍历。二叉树的层序遍历是一种按照树的层次从上到下,从左到右访问每个节点的方法。例如,对于下面这棵二叉树:

    1
   / \
  2   3
 / \ 
4   5

它的层序遍历结果是:[1, 2, 3, 4, 5]。

那么,如何实现这种遍历方法呢?我们可以使用一个队列来辅助我们。队列是一种先进先出(FIFO)的数据结构,也就是说,先进入队列的元素会先出队,后进入队列的元素会后出队。

我们的思路是这样的:

  • 首先,我们判断根节点是否为空,如果为空,就直接返回一个空的二维向量作为结果。
  • 如果不为空,我们就把根节点入队,并记录当前层的节点数为1(因为只有根节点一个节点)。
  • 然后,我们开始一个循环,直到队列为空为止。在每次循环中,我们做以下几件事:
    • 创建一个一维向量来存储当前层的节点值。
    • 使用一个内层循环来遍历当前层的所有节点。在每次内层循环中,我们做以下几件事:
      • 将队首的节点出队,并将其值放入一维向量中。
      • 判断该节点是否有左右子节点,如果有,就将它们入队。
    • 当内层循环结束时,说明当前层的所有节点都已经处理完毕,将一维向量放入二维向量中。
    • 更新下一层的节点数为队列中剩余的元素个数。
  • 当外层循环结束时,说明队列中已经没有元素了,也就是说所有层都已经遍历完毕,返回二维向量作为结果。

这样,我们就实现了二叉树的层序遍历算法。
代码(已加注释):

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) { // 定义一个公共的函数,接受一个二叉树的根节点作为参数,返回一个二维向量,表示每一层的节点值
        queue<TreeNode*> q; // 定义一个队列来存储每一层的节点
        int levelsize =0; // 定义一个变量来记录当前层的节点数
        if(root) // 判断根节点是否为空
        {
            q.push(root); // 如果不为空,就把根节点入队
            levelsize = 1; // 并将当前层的节点数设为1
        }

        vector<vector<int>> vv; // 定义一个二维向量来存储结果
        while(! q.empty()) // 使用一个循环来处理队列中的节点,直到队列为空为止
        {
            //通过levelsize控制一层一层出
            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); // 当内层循环结束时,说明当前层的所有节点都已经处理完毕,将一维向量放入二维向量中
            //更新下一层的数据
            levelsize = q.size(); // 将下一层的节点数设为队列中剩余的元素个数
        }
        return vv; // 当外层循环结束时,说明队列中已经没有元素了,也就是说所有层都已经遍历完毕,返回二维向量作为结果 
    }
};

二叉树的分层遍历2

链接:层序遍历2 — 自底向上
这个其实很简单,把自上而下遍历的结果逆置一下就行了,复用了
代码:

//....前面一样
        reverse(vv.begin(),vv.end() ); //逆置一下
        return vv; // 当外层循环结束时,说明队列中已经没有元素了,也就是说所有层都已经遍历完毕,返回二维向量作为结果 
    }
};

本节完

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

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

相关文章

Linux_红帽8学习笔记分享_7(Crontab计划任务+NTP时间同步服务器)

Linux_红帽8学习笔记分享_7(Crontab计划任务NTP时间同步服务器) 文章目录 Linux_红帽8学习笔记分享_7(Crontab计划任务NTP时间同步服务器)1. 系统时间1.1查看系统时间1.2设置系统时间 2.周期性计划任务2.1认识周期性任务服务2.2寻找定时文件的配置文件2.3用户定时任务的格式2.4…

行业方案|智能网联汽车数据安全治理框架

近年来&#xff0c;信息技术的快速发展&#xff0c;加快了汽车产业的变革。与此同时&#xff0c;随着智能化、网联化的推进&#xff0c;汽车的数据安全问题也日益凸显。当下&#xff0c;如何保障数据安全&#xff0c;成为影响智能汽车产业健康发展的关键问题。 4月18日&#x…

Linux Ansible创建任务并执行

目录 通过add-hoc执行anbise任务 通过Playbook剧本方式执行任务 Playbook包含的常用对象 Yaml语法 对Yaml格式自动对齐 Playbook语法检测与执行 Playbook任务实施 Playbook特权升级 Playbook常用模块 软件包管理模块 用户管理模块 存储模块管理 文件操作相关模块 …

GPT-3 论文阅读笔记

GPT-3模型出自论文《Language Models are Few-Shot Learners》是OpenAI在2020年5月发布的。 论文摘要翻译&#xff1a;最近的工作表明&#xff0c;通过对大量文本进行预训练&#xff0c;然后对特定任务进行微调&#xff08;fine-tuning)&#xff0c;在许多NLP任务和基准测试上…

TYPE-C口是怎么样的接口?它有什么功能强大的地方?

C口指的是USBType-C接口。USBType-C&#xff0c;又称USB-C&#xff0c;是一种通用串行总线(USB)的硬件接口形式&#xff0c;外观上最大特点在于其上下端完全一致与Micro-USB相比不再区分USB正反面。 认识了Type-C的外观之后&#xff0c;我们来一起看一下它是怎么产生的。早在20…

QT with OpenGL(IBL-镜面反射)

文章目录 预滤波generate Mipmap获取每一层级的预滤波图prefilterMap Shader重要性采样效果展示 预过滤卷积的亮点解决方法代码解析首先得确保我们被采样的环境贴图有mipmap贴图通过计算决定使用那一层mipmap值 效果 预计算BRFD生成LUT图 IBL Shading渲染结果与教材的不同最终结…

(C语言版)力扣(LeetCode)189. 轮转数组官方3种解法分析

轮转数组 题目第一种解法&#xff1a;额外数组第二种解法&#xff1a;环状替换第三种解法&#xff1a;翻转数组结语 题目 题目链接&#xff1a;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: num…

实战项目:手把手带你实现一个高并发内存池

项目介绍 1.这个项目做的是什么&#xff1f; 当前项目是实现一个高并发的内存池&#xff0c;他的原型是google的一个开源项目tcmalloc&#xff0c;tcmalloc全称Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;实现了高效的多线程内存管理&#xff0c;用于替…

Java——字符串的排列

题目链接 牛客网在线oj题——字符串的排列 题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数…

【SpringMVC】| SpringMVC 入门

目录 一&#xff1a;SpringMVC 入门 1. SpringMVC简介 2. SpringMVC的优点 3. SpringMVC的优化 4. SpringMVC执行的流程 5. 基于注解的SpringMVC程序 图书推荐 一&#xff1a;《Spring Boot进阶&#xff1a;原理、实战与面试题分析》 二&#xff1a;《深入理解Java虚拟…

19.网络爬虫—照片管道

网络爬虫—照片管道 Scrapy基础Scrapy运行流程原理Scrapy的工作流程 scrapy照片管道实战演示设置图片路径配置爬虫解析数据运行爬虫查看文件 后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域…

C++ Primer笔记——排列算法(next_permutation、prev_permutation、is_permutation)

目录 概述 ①next_permutation ②prev_permutation ③is_permutation 概述 页数&#xff1a;P778 &#xff08;A.2.7 排列算法&#xff09; 头文件&#xff1a;<algorithm> 函数名&#xff1a;next_permutation & prev_permutation & is_permutation C为…

信息安全复习七:报文鉴别与哈希函数

一、章节梗概 1.安全服务与安全需求 2.报文鉴别的安全需求 3.对报文加密来实现报文鉴别 4.报文鉴别码 5.哈希函数 6.生日攻击 二、安全服务与安全需求 2.1 引入 通信保密可以概况所有的安全需求吗? 不能&#xff0c;信息安全需求有很多种&#xff0c;通信保密只是一种安全…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日&#xff0c;以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办&#xff0c;众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间&#xff0c;移动云深入践行“为国建云”的使命&#xff0c;推出“六大”服…

vdo磁盘管理

在 storagesrv 上新加一块 10G 磁盘;  创建 vdo 磁盘,并开启 vdo 磁盘的重删和压缩;  名字为 vdodisk,大小为 150G,文件系统为 ext4;  并设置开机自动挂载。挂载到/vdodata。 1.lsblk 查看自己添加的硬盘名称 2.安装vdo软件包 yum -y install vdo…

卡尔曼滤波原理及代码

目录 一.简介 二.原理 1.先验估计原理 2.后验估计原理 3.总结 三.示例 一.简介 卡尔曼滤波&#xff08;Kalman filtering&#xff09;是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法&#xff0c;它可以在任意…

Vue-全局过滤器以及进阶操作

前言 上篇文件讲述了&#xff0c;Vue全局过滤器的基本使用&#xff1a;Vue过滤器的基本使用 本篇将延续上文&#xff0c;讲述vue中过滤器的进阶操作 过滤器传参 如果有一天&#xff0c;多个地方使用过滤器&#xff0c;而且需要传递参数&#xff0c;那么可以这么写 多个过滤…

《Netty》从零开始学netty源码(四十三)之PoolChunk.allocate

allocate PoolChunk分配内存空间时可调用allocate方法来分配&#xff0c;具体的源码过程如下&#xff1a; 从代码中可以看出会根据分配的内存大小决定分配的是subpage还是normal的page&#xff0c;接下来具体分析以下方法&#xff1a; allocateSubpageallocateRuninitBuf …

Unity|| 如何把生存类游戏设计得更优秀

你是否曾经玩过这样的生存类游戏&#xff1a; 1、通过最初阶段后&#xff0c;你觉得游戏变得越来越简单 2、游戏的重点从生存转移到了基地建设或其他方面 诸如此类&#xff0c;很大程度上是由于糟糕的难度曲线所致。包括很多&#xff08;非常受欢迎的&#xff09;生存游戏都…

Redis——缓存更新策略

业务场景&#xff1a; 低一致性需求&#xff1a;使用内存淘汰机制。例如店铺类型的查询缓存&#xff0c;很少修改 高一致性需求&#xff1a;主动更新&#xff0c;并以超时剔除作为兜底方案。例如店铺详情查询的缓存&#xff0c;经常修改 主动更新策略 实际开发中最常用的还是…