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

题目描述

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

102.二叉树的层次遍历题目

上面的题就是 二叉树的层次遍历 题目的截图,同时 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> 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> levelOrder(TreeNode* root) {        vector> vec;        if (root == NULL) {            return vec;        }        // 队列保存树的根节点        queue que;        que.push(root);        while (!que.empty()) {            // 保存当前层上节点的值            vector 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 语言这样没有现成的集合可以使用,我还要自己去完成一个队列的数据结构去进行管理么?不知道有什么好的方法。

c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历相关推荐

  1. 按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历

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

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

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

  3. 【算法学习笔记】二叉树的基本操作实现和应用举例,根据先序与中序遍历建立二叉树的实现

    基本操作 给某结点插入一个左孩子 删除二叉树中某结点的左子树 根据先序与中序遍历建立二叉树 应用举例 查找数据元素 二叉链表存储结构 统计叶结点的数目 基本操作 通常有:建立空二叉树.生成以X为根节点 ...

  4. 二叉树先序,中序,后序,层次遍历(数据结构)

    先序遍历 先序遍历可以想象为,一个小人从一棵二叉树的根节点为起点,沿着二叉树的外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果 先序遍历的结果为:A B D H I E J C F ...

  5. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++...

    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++ Given preo ...

  6. 二叉树的基本操作(建立与遍历)

    [问题描述] 以二叉链表的形式创建二叉树(不超过20个结点),并编写二叉树的遍历算法,实现二叉树的先序.中序及后序三种遍历. [输入形式] 输入二叉树的结点信息(以先序遍历方式建立二叉树). [输出形 ...

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

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

  8. # 遍历结构体_关于二叉树怎样建立和四种遍历方法你知道吗?

    1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历 1. 首先我们要知道二叉树的性质是什么 在二叉树上, ...

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

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

最新文章

  1. Map集合遍历的四种方式理解和简单使用
  2. boost::mp11::mp_bind_back相关用法的测试程序
  3. ubuntu snmp Error: unknown payload OID
  4. 监控mysql主从复制监控_shell脚本监控mysql主从同步状态
  5. Flex 4命名空间
  6. cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析...
  7. tomcat-9.0.20部署的问题及性能监控
  8. Atitit 常见编程语言读写数据库的api目录1.1. Php pdo 11.2. Java jdbctmpltr 11.3. Nodejs mysql模块 11.4. Pytho
  9. 关于ie6常见浏览器兼容问题
  10. R语言中三线表是什么?使用table1包绘制(生成)三线表实战
  11. java.lang.IllegalArgumentException: requirement failed: indices should be one-based and in ascending
  12. webrtc.node: undefined symbol: _ZN3rtc10DIGEST_MD5E
  13. stm32f103r8t6的晶振频率_STM32F103R8T6
  14. 项目管理知识体系指南(四)项目管理范围
  15. Unity LookAt 2D锁定
  16. 华为发布新一代CloudLink协作智真
  17. 免费的ppt模板百度网盘资源
  18. 13-mac中插入SD卡无法格式化,无法删除文件,只读
  19. http常见状态返回码
  20. 【论文阅读】Learning with Hypergraphs: Clustering, Classification, and Embedding

热门文章

  1. python中for循环和while循环的区别_Python中for循环和while循环有什么区别?
  2. 计算机房装修对门的要求,防火门尺寸要求有哪些 防火门尺寸规范
  3. 用这样的方法,我解决了leetcode的大部分的这种题型!
  4. 聊一聊二维码扫描登录原理
  5. SpringMVC+RestFul详细示例实战教程(实现跨域访问)
  6. mysql的driver和url_数据库连接driverClass和jdbcUrl大全
  7. centos8 配置 dns_Linux搭建DHCP+DNS+WEB服务
  8. 线性结构--离散存储 链表讲解
  9. ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)
  10. java excel data 导入数据_java实现导入导出excel数据