登场之后,我要打十个!

看完这篇文章虽然不能打十个,但是可以迅速打五个!而且够快!

102.二叉树的层序遍历

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

思路

我们之前讲过了三篇关于二叉树的深度优先遍历的文章:

  • 二叉树:前中后序递归法
  • 二叉树:前中后序迭代法
  • 二叉树:前中后序迭代方式统一写法

接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,「队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。」

「而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。」

使用队列实现二叉树广度优先遍历,动画如下:

这样就实现了层序从左到右遍历二叉树。

代码如下:「这份代码也可以作为二叉树层序遍历的模板,以后再打四个就靠它了」

C++代码

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}return result;}
};

「此时我们就掌握了二叉树的层序遍历了,那么如下四道leetcode上的题目,只需要修改模板的一两行代码(不能再多了),便可打倒!」

107.二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

思路

相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。

C++代码

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;for (int i = 0; i < size; i++) { TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}reverse(result.begin(), result.end()); // 在这里反转一下数组即可return result;}
};

199.二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

思路

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。

C++代码

class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<int> result;while (!que.empty()) {int size = que.size();for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (i == (size - 1)) result.push_back(node->val); // 将每一层的最后元素放入result数组中if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return result;}
};

637.二叉树的层平均值

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

思路

本题就是层序遍历的时候把一层求个总和再取一个均值。

C++代码

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<double> result;while (!que.empty()) {int size = que.size();double sum = 0; // 统计每一层的和for (int i = 0; i < size; i++) { TreeNode* node = que.front();que.pop();sum += node->val;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(sum / size); // 将每一层均值放进结果集}return result;}
};

429.N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

例如,给定一个 3叉树 :

返回其层序遍历:

[
[1],
[3,2,4],
[5,6]
]

思路

这道题依旧是模板题,只不过一个节点有多个孩子了

C++代码

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;for (int i = 0; i < size; i++) { Node* node = que.front();que.pop();vec.push_back(node->val);for (int i = 0; i < node->children.size(); i++) { // 将节点孩子加入队列if (node->children[i]) que.push(node->children[i]);}}result.push_back(vec);}return result;}
};

总结

二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时是不是又发现队列的应用了)。

学会二叉树的层序遍历,可以一口气撸完leetcode上五道题目:

  • 102.二叉树的层序遍历
  • 107.二叉树的层次遍历II
  • 199.二叉树的右视图
  • 637.二叉树的层平均值
  • 589.N叉树的前序遍历

虽然不能一口气打十个,打五个也还行。

如果非要打十个,还得找叶师傅!

本文:

https://github.com/youngyangyang04/leetcode-master​github.com

已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

我的B站(里面有我讲解的算法视频已经编程相关知识):

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili​space.bilibili.com

我是程序员Carl,哈工大师兄,先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「个人简介」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。

遍历children_二叉树:层序遍历登场!相关推荐

  1. 二叉树层序遍历_求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  2. 牛客-二叉树层序遍历

    牛客-二叉树层序遍历 #include <stdio.h> #include <queue> #include <stack> #include <math. ...

  3. 【LeetCode】专题一 二叉树层序遍历

    二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...

  4. 二叉树层序遍历(c语言,非递归)

    层序遍历的作用是将二叉树,从上到下,从左到右依次遍历.如下图遍历的结果是A->B->C->D->E->F->G->H.其实,这就相当于族谱一样,从辈分大到小遍 ...

  5. 数据结构:二叉树层序遍历和判断是否为完全二叉树

    层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...

  6. 二叉树层序遍历分层[递归迭代两种思想+三种解法]

    层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ...

  7. 102 二叉树层序遍历

    层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组 BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列. 层序遍历相对于BFS, ...

  8. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  9. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集...

    L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个 ...

最新文章

  1. java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统
  2. centos 忘记root密码_Linux忘记root密码解决方案
  3. a data source instance has not been supplied for the datasource 'dataset1'. rdlc
  4. Pytorch有关张量的各种操作
  5. [Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]
  6. java中的foreach
  7. java逆向生成代码有哪些_利用mybatis逆向工程生成代码
  8. 运筹学常考知识点总结一
  9. [python] 将一个序列的排序方式扩展到其他序列
  10. 《回话的技术》阅读笔记
  11. 厦门大学邢兆雨:从统计专业到王亚南经济研究院博士生!
  12. 三型两步验证登不上_Apple ID 两步验证
  13. amp;#9733;用辩证数学解答“缸中之脑”
  14. linux 搜狗输入法使用技巧,在Deepin 20系统中使用官方搜狗输入法的技巧
  15. 2012年***名单。
  16. 动态MAC地址和静态MAC地址
  17. 【canvas画图】画一个彩虹
  18. 计算机硬件的五个功能部件及其功能
  19. 首款超声波指纹读取器面世:用声音解锁手机 或用于移动支付
  20. win10连接filco蓝牙键盘

热门文章

  1. 周期性工作crontab
  2. 桌面云计算: 提供灵活、可靠双保险
  3. ubuntu下Pure-FTPd的安装和配置
  4. JS 语法糖 0 —— 解构
  5. 邓俊辉数据结构学习-7-BST
  6. 配置网络策略中的 NAP 条件
  7. 12306订票助手秘笈:2013春节我要回家
  8. 修复 github 项目的语言属性
  9. 我经历的IT公司面试及离职感受(转)
  10. Matlab程序怎样打包