这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历

题目描述

题目直接从 LeetCode 上截图过来,题目如下:

上面的题就是 二叉树的层次遍历 题目的截图,同时 LeetCode 会根据选择的语言给出一个类的定义或者函数的定义,然后在其中实现 二叉树的层次遍历 的解题过程。这次我使用 C++ 语言来进行完成。

C++ 语言给出的函数定义如下:

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<vector<int>> levelOrder(TreeNode* root) {            }};

通过函数定义可以看出,levelOrder 函数的参数是一个二叉树的根节点,然后返回的值是一个二维数组,我们要做的就是按照层次来遍历这个二叉树,并且将二叉树每层的值需要保存在二维数组中并返回。

问题分析

该题目是一个比较好理解的题目,因为题目中已经明确了需要使用层次遍历二叉树来得到每个节点上的值,且不同层次上节点的数据保存在不同的数组中,最后每个层次的数组构成一个二维数组。

拿题目中给出的例子来说明什么是层次遍历,如下图。

在图中,3 是第一层9 和 20 是第二层15 和 7 是第三层,通过遍历这个二叉树按层次来分别把它们保存到不同的数组中,最后构成一个二维数组返回。

二叉树的层次遍历需要使用另外一个数据结构来协助进行遍历,另外的那个数据结构就是“队列”。队列的作用是保留每一层的从左到右的顺序,进而使得我们在进行层次遍历的时候,可以按照从左往右的顺序完成层次遍历。

首先在遍历之前,使根节点先进入队列,队列中有了根节点后,就可以进入循环。进入循环后,首先获取队头的元素,并让队头元素出队,目前也就是根节点,通过出队的元素分别得到它的左孩子和右孩子,并让它的左孩子和右孩子进入临时队列(有可能左孩子和右孩子不同时存在,反正存在哪个哪个进入队列即可)。然后保存当前节点的元素到数组中。然后临时队列中的元素,进入真正要进行循环获取层次的队列,队列中始终要保持只有当前层次的节点。

由于篇幅有限,可能无法很好的把其方式描述清楚,但是看代码会很直观。

代码实现

C++ 的代码如下:

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<vector<int>> levelOrder(TreeNode* root) {        vector<vector<int>> vec;        if (root == NULL) {            return vec;        }        // 队列保存树的根节点        queue que;        que.push(root);        while (!que.empty()) {            // 保存当前层上节点的值            vector<int> v;            // 临时队列            queue tmp;            while (!que.empty()) {                TreeNode *p = que.front();                que.pop();                // 左右节点入队                if (p->left) {                    tmp.push(p->left);                }                if (p->right) {                    tmp.push(p->right);                }                v.push_back(p->val);            }            // 下一层的节点入队            while (!tmp.empty()) {                que.push(tmp.front());                tmp.pop();            }            vec.push_back(v);        }        return vec;    }};

从代码中可以看出,整个代码是一个两层 while 循环,外层的 while 循环用来遍历整颗二叉树,内层 while 循环是用来遍历二叉树相同层的每个节点。代码中,我引入了两个队列,分别是 que 和 tmp,que 队列是用来进行遍历当前层的每个节点的,tmp 队列是用来临时保存当前层的左孩子和右孩子节点的。

提交结果

在写完代码后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们可以根据给出的测试用例来继续修改代码。我们的代码提交后的截图如下:

类似这样需要引入其他数据结构辅助完成的题目,我个人觉得使用 C 语言就比较难,就拿这道题目来说,层次遍历二叉树本身就是两层的 while 循环了,还要引入队列去辅助完成,像 C 语言这样没有现成的集合可以使用,我还要自己去完成一个队列的数据结构去进行管理么?不知道有什么好的方法。

看都看完了,还不点这里试试

按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历相关推荐

  1. c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历

    这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 102.二叉树的层次遍历题目 上面的题就是 二叉树的层次遍历 题目 ...

  2. 二叉树外部节点_leetcode 102 二叉树的层序遍历1 /BFS

    广度优先搜索(BFS)的基本思想: 在二叉树上进行BFS遍历(对上图解释的代码实现) //BFS 使用队列void bfs (TreeNode root){ Queuequeue=new ArrayD ...

  3. 107. 二叉树的层序遍历 II and 102. 二叉树的层序遍历 023(BFS模板题打两道)

    一:题目 二:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* Tre ...

  4. 代码随想录【day 14 二叉树】| 层序遍历 226.翻转二叉树 101.对称二叉树

    代码随想录[day 14 二叉树]| 层序遍历 226.翻转二叉树 101.对称二叉树 层序遍历 卡哥文解 视频讲解 题目链接:102.二叉树的层序遍历 解题思路 代码实现 题目链接:107.二叉树的 ...

  5. leetcode 102 java_Java实现 LeetCode 102 二叉树的层次遍历

    102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / 9 20 ...

  6. 102. 二叉树的层次遍历

    102. 二叉树的层次遍历 题意 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 解题思路 递归:利用前序遍历的思想,在递归过程中记录下结点的深度,在对应深度将结点加 ...

  7. Leetcode 102. 二叉树的层次遍历

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3    / \   9  20     / ...

  8. LeetCode 102. 二叉树的层次遍历(BFS)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15, ...

  9. 【Leetcode】102. 二叉树的层次遍历

    题目 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 返回其层 ...

最新文章

  1. 使用Javascript创建XML文件
  2. http请求中的Query String Parameters、Form Data、Request Payload
  3. 7位应届生讲述就业难:面试20多家公司,甚至当了保安
  4. 随笔 | 写代码时极有可能面临的焦虑
  5. 【Luogu2393】yyy loves Maths II(浮点输入输出)
  6. 总谐波失真计算公式_知识学习:谐波的危害
  7. 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
  8. 程序员如何预防颈椎病?
  9. 手把手教你写Linux I2C设备驱动 tvp5158
  10. 01-计算机系统概述
  11. ISTQB基础级考试心得
  12. win10安装linux系统视频播放器,u盘安装linux视频mac制作win10安装u盘
  13. 佛山市政携手企企通,打造高效协同的云端极速供应链
  14. 自动打开html网页脚本,开启网页全屏插件(自动开启网页全屏脚本js插件)
  15. 美国次级抵押贷款市场的来龙去脉(转)
  16. python namedtuple_python 简单了解namedtuple
  17. Java EE开发基础
  18. 【算法题】机器人走迷宫
  19. 利用Open 3D建立三维模型
  20. EXCEL教程 | 制作1月16日全国新增病例疫情分布地图

热门文章

  1. 远程连接后无法看到本地电脑分区解决方法
  2. keyboard键盘demo
  3. JS判断浏览器类型与版本
  4. [转]Sandboxie 的工作原理
  5. Nokia Imaging SDK滤镜使用入门
  6. Perl多线程ping加端口扫描
  7. 解释OBJECT_ID和OBJECTPROPERTY
  8. python 通过索引迭代列表_python – NumPy – 迭代2D列表和打印(行,列)索引
  9. git创建分支合并到master分支步骤
  10. Oops快速定位代码行方法