每日一题:LeetCode-102.二叉树的层序遍历

news2024/11/17 7:25:56

每日一题系列(day 03)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️

LeetCode-102.二叉树的层序遍历

题目:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

注意事项:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

解法一:

  思路:

  说到二叉树的层序遍历,我们第一反应肯定是用广度优先搜索,广搜需要队列存储每一层的节点,当一层节点处理完之后再将本层已处理的节点全部pop掉,接着处理下一层节点,直到处理完毕,深搜便完成了,这里题目要求用二维数组来接收深搜的结果,所以我们可以开个二维数组,在每层节点pop之前,把每层节点记录在一位数组中,最终把一维数组放到二维数组中。每一层的二维数组都代表每一层的节点的遍历结果。

  1、首先,当节点为空的时候我们直接返回空的二维数组。不为空则根据题目要求创建一个二维数组,再创建队列来记录二叉树的每个节点,再将根节点压入到队列中。
  2、节点已经入队,开始处理二叉树。我们知道,二叉树有很多层,所以我们需要一层一层来遍历,每一层处理完后,本层节点也被pop,再处理下一层,其实这就是一个循环的过程。条件是只要不为空就一直处理。
  3、在循环内,创建一个临时一维数组来记录本层所有节点的值,用计数器来记录这层拥有的节点个数,再使用for循环处理每一层的节点。
  4、for循环内,取队头元素,将队头的元素值压入本层的一维数组中,当处理的当前节点时,如果当前节点有子节点,就把下一层的子节点入队,用来下次的遍历,最后再将当前已经处理完了的节点pop出队列。
  5、最后直接返回二维数组即可。

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == NULL)
        vector<vector<int>> ans;//根据题目要求创建一个二维数组
        return vector<vector<int>>();//节点为空直接返回空的二维数组即可
        queue<TreeNode *> q;//创建一个队列用来记录每一层的节点
        TreeNode *node = nullptr;//记录队列的每个节点,便于处理单个节点
        q.push(root);//将根节点压入队列

        while(!q.empty())//只要队列不为空说明这一层还存在节点
        {
            int cnt = q.size();//记录队列节点数量
            vector<int> tmp;//使用tmp数组接收每一层的节点
            for(int i = 0 ; i < cnt ; i++)//处理每层的节点
            {
                node = q.front();//记录取队头节点
                tmp.push_back(node -> val);//在队列这层节点pop之前将节点值压入本层的一维数组,这个一维数组就是这层节点
                if(node -> left) q.push(node -> left);//本层节点的左子树存在就把左孩子入队列,下次处理
                if(node -> right) q.push(node -> right);//本层节点的右子树存在就把右孩子入队列,下次处理
                q.pop();//本层节点处理完,把本层pop掉,处理下一层节点
            }
            ans.push_back(tmp);//将一维数组(本层遍历结果)尾插进二维数组
        }
        return ans;//返回二维数组即可
    }
};

解法二:

  思路:

  其实这题完全可以不用广搜,使用深搜也能进行层序遍历,并且使用深搜的代码会更加简洁一些。使用深搜也就是dfs,那么如何深搜才是关键,其实我们只需要知道每个节点的层数就可以进行深搜了,我们可以直接用节点的层数把深搜的每个节点压入到对应层的数组中。

  1、在深度优先搜索前,我们按照题目要求先创建一个二维数组,然后进行深搜,这里需要注意,dfs的参数首先要传入根节点,在传入从哪层开始处理的层次(从第0层开始处理),最后再传参二维数组的引用。
  2、进入到深搜,如果节点为空的话直接返回。当本层层数与二维数组存储的一维数组数量相等,表示已经处理到当前的层数了,这个时候在二维数组当前层数(下标)插入一个空一维数组。
  3、接下来就将每一层的节点插入到对应层的一维数组中,然后向左子树搜索,左子树为当前层的下一层,所以传参k + 1,然后向右子树搜索,同样层数为k + 1,最后return即可。

在这里插入图片描述

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void dfs(TreeNode *root, int k, vector<vector<int>> &ans)//传参需要根节点,节点所在层数,以及二维数组的引用传参
    {
        if(root == NULL) return;//根节点为null直接返回
        if(k == ans.size()) ans.push_back(vector<int>());//当当前层数与二维数组存储一维数组数量相同时,表示处理到当前的层数了,对二维数组进行尾插一个空一维数组
        ans[k].push_back(root -> val);//将每一层的节点尾插到每一层的数组里
        dfs(root -> left,  k + 1, ans);//深搜左子树,下一层节点层数要加一
        dfs(root -> right, k + 1, ans);//同样,深搜下一层右子树,层数加一
        return;//深搜结束
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;//创建二维数组
        dfs(root, 0, ans);//进行深搜
        return ans;//返回深搜结果即可
    }
};

  二叉树的层序遍历,我们通常是使用第一种队列的方式进行广度优先搜索,然而用深度优先搜索来对二叉树层序遍历的代码设计感更优美,可读性也更高。

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

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

相关文章

使用Python对CSI相位进行矫正,并进行图像调整

一、前言 我记得我是最早将《MatLab对CSI的相位进行矫正》代码上传至网上的&#xff0c;后面陆续有人进行抄袭&#xff0c;不得已把一些细节和代码进行隐藏。今天整理之前Python代码的时候&#xff0c;发现一些不规范的问题&#xff0c;所以写了这篇博客。 二、使用Python对C…

大数据基础设施搭建 - Hive

文章目录 一、上传压缩包二、解压压缩包三、配置环境变量四、初始化元数据库4.1 配置MySQL地址4.2 拷贝MySQL驱动4.3 初始化元数据库4.3.1 创建数据库4.3.2 初始化元数据库 五、启动元数据服务metastore5.1 修改配置文件5.2 启动/关闭metastore服务 六、启动hiveserver2服务6.1…

手动实现 git 的 git diff 功能

这是 git diff 后的效果&#xff0c;感觉挺简单的&#xff0c;不就是 比较新旧版本&#xff0c;新增了就用 "" 显示新加一行&#xff0c;删除了就用 "-" 显示删除一行&#xff0c;修改了一行就用 "-"、"" 显示将旧版本中的该行干掉了并…

C#FlaUI.UIA实现发送微信消息原理

一 准备 .NetFramework 4.8 FlaUI.UIA3 4.0.0 FlaUInspect V1.3.0 1下载FlaUInspect https://github.com/FlaUI/FlaUInspect FlaUInspect V1.3.0 百度网盘下载 2 NuGet 引用 flaUI.UIA3 4.0.0 二代码部分 1 引用FlaUI using FlaUI.Core; using FlaUI.Core.Automatio…

深度学习基于Python+TensorFlow+Django的水果识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组合系统功能使用流程 二、功能三、系统四. 总结 一项目简介 # 深度学习基于PythonTensorFlowDjango的水果识别系统介绍 简介 该水果识别系统基于…

比较2个点的3种结构在不规则平面上的占比

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在平面上有一个点x&#xff0c;再增加一个点,11的操作把平面分成了3部分2a1&#xff0c;2a2&#xff0c;2a3&#xff0c;3部分的比值是 2a1 2a2 2a3 5 25 …

单词接龙00

题目链接 单词接龙 题目描述 注意点 1 < beginWord.length < 10endWord.length beginWord.lengthwordList[i].length beginWord.lengthbeginWord、endWord 和 wordList[i] 由小写英文字母组成wordList 中的所有字符串 互不相同 解答思路 从beginWord开始&#xff…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主&#xff0c;一套不错的流量主变现资源下载小程序&#xff0c;它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级&#xff0c;并依然注重资源下载和激励视频变现的功能。另外&#xff0c;还新增了…

智慧楼宇可视化视频综合管理系统,助力楼宇高效安全运行

随着互联网技术的进步和发展&#xff0c;智能化的楼宇建设也逐步成为人们选择办公场所是否方便的一个重要衡量因素。在智能化楼宇中&#xff0c;安全管理也是重要的一个模块。得益于互联网新兴技术的进步&#xff0c;安防视频监控技术也得到了快速发展并应用在楼宇的安全管理中…

羊大师:强健身体是成功的关键

健康是一项无价的财富&#xff0c;拥有强健的身体是实现人生目标的关键。而如何保持健康并拥有一个强健的身体呢&#xff1f;下面就为大家分享一些有效的健身方法和建议&#xff0c;帮助您达到健美身材的目标。 良好的饮食习惯是形成强健身体的基石。我们要摄入足够的营养物质…

uniapp开发的微信小程序进行代码质量控制,分包+压缩js+组件按需注入等

小程序代码分包的操作请看另外一篇文章&#xff1a;uniapp分包优化&#xff0c;包括分包路由跳转规则-CSDN博客 JS文件压缩&#xff1a;在工具「详情」-「本地设置」中开启「上传代码时自动压缩脚本文件」的设置 代码包&#xff1a;组件 > 启用组件按需注入解决办法 在小程…

如何选择ZK-friendly 哈希函数?

1. 引言 在What’s the deal with hash functions in Zero Knowledge?中&#xff0c;研究了哈希函数对ZKP场景的用途。当前有各种ZK-friendly 哈希函数设计&#xff0c;各有优缺点&#xff0c;且针对不同的性能维度进行了优化&#xff0c;如&#xff1a; MiMCGMiMCPoseidonP…

Instrumentation 是什么?和 ActivityThread 是什么关系?

Instrumentation 可以理解为应用进程管家&#xff0c;ActivityThread 要执行创建或暂停某个 Activity 的操作时&#xff0c;都需要通过 Instrumentation 来进行具体的操作&#xff0c;即回调 Activity 的生命周期。 每一个应用程序只有一个 Instrumentation 对象&#xff0c;每…

ubuntu挂载硬盘方法

1.关闭服务器加上新硬盘 2.启动服务器&#xff0c;以root用户登录 3.查看硬盘信息 fdisk -l4.格式化分区 找到需要分区的目录,并记录分区的uuid&#xff0c;用于后面修改/etc/fstab永久挂载配置文件 mkfs.ext4 /dev/nvme0n1 mkfs.ext4 /dev/nvme1n1 Filesystem UUID: a1c…

修改mysql的密码(每一步都图文解释哦)

当你想要连接本机数据库时&#xff0c;是不是有可能突然忘记了自己的数据库密码? 在此文中&#xff0c;我们来详细解决一下如何去修改自己的数据库密码&#xff0c;并使用Navicat来连接测试 1.停止mysql服务 打开终端&#xff0c;键入命令,将mysql服务先停止掉&#xff0c;…

【正点原子STM32连载】 第六十章 串口IAP实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第六十…

手把手用GPT开发小程序全流程!就是这么easy~

大家好&#xff0c;我是五竹。 前段时间用GPT开发了一款小程序:GPT真牛批&#xff01;三天开发一个小程序&#xff0c;三天积累了2000的用户&#xff0c;上周末抽空又接入了流量主&#xff0c;感兴趣的同学可以围观一下。 今天就来带大家走一遍用GPT开发一款小程序的全过程&a…

怎么禁止员工私自修改ip地址

在许多组织中&#xff0c;网络管理员负责配置和管理网络&#xff0c;包括为员工分配静态IP地址。然而&#xff0c;有些员工可能会试图修改这些分配的IP地址&#xff0c;这可能会导致一系列问题&#xff0c;包括网络性能下降、安全风险增加等。 因此&#xff0c;禁止员工私自修…

羊奶加西柚,羊大师教你减少自由基

羊奶加西柚&#xff0c;减少自由基的好处真的是多得数不胜数。无论是从营养角度&#xff0c;还是从健康角度考虑。羊奶富含蛋白质、维生素和矿物质&#xff0c;西柚富含维生素C和抗氧化剂。结合起来&#xff0c;它们可以提供许多健康益处&#xff0c;并为我们的身体抵御自由基的…

轻松搬运!手推小车助力制造企业高效装卸

手推车是一种非常方便高效的搬运工具。它可以帮助我们轻松搬运重物&#xff0c;节省时间和精力。不论是在仓库、工厂、商场还是家庭&#xff0c;手推车都扮演着重要的角色。 在现代物流与生产领域&#xff0c;高效的装卸作业是确保生产流程畅通的重要环节。手推小车作为一种便…