遍历children_二叉树:层序遍历登场!
登场之后,我要打十个!
看完这篇文章虽然不能打十个,但是可以迅速打五个!而且够快!
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-mastergithub.com
已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!
我的B站(里面有我讲解的算法视频已经编程相关知识):
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com
我是程序员Carl,哈工大师兄,先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「个人简介」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。
遍历children_二叉树:层序遍历登场!相关推荐
- 二叉树层序遍历_求二叉树的层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...
- 牛客-二叉树层序遍历
牛客-二叉树层序遍历 #include <stdio.h> #include <queue> #include <stack> #include <math. ...
- 【LeetCode】专题一 二叉树层序遍历
二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...
- 二叉树层序遍历(c语言,非递归)
层序遍历的作用是将二叉树,从上到下,从左到右依次遍历.如下图遍历的结果是A->B->C->D->E->F->G->H.其实,这就相当于族谱一样,从辈分大到小遍 ...
- 数据结构:二叉树层序遍历和判断是否为完全二叉树
层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...
- 二叉树层序遍历分层[递归迭代两种思想+三种解法]
层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ...
- 102 二叉树层序遍历
层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组 BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列. 层序遍历相对于BFS, ...
- 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)
二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集...
L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个 ...
最新文章
- java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统
- centos 忘记root密码_Linux忘记root密码解决方案
- a data source instance has not been supplied for the datasource 'dataset1'. rdlc
- Pytorch有关张量的各种操作
- [Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]
- java中的foreach
- java逆向生成代码有哪些_利用mybatis逆向工程生成代码
- 运筹学常考知识点总结一
- [python] 将一个序列的排序方式扩展到其他序列
- 《回话的技术》阅读笔记
- 厦门大学邢兆雨:从统计专业到王亚南经济研究院博士生!
- 三型两步验证登不上_Apple ID 两步验证
- amp;#9733;用辩证数学解答“缸中之脑”
- linux 搜狗输入法使用技巧,在Deepin 20系统中使用官方搜狗输入法的技巧
- 2012年***名单。
- 动态MAC地址和静态MAC地址
- 【canvas画图】画一个彩虹
- 计算机硬件的五个功能部件及其功能
- 首款超声波指纹读取器面世:用声音解锁手机 或用于移动支付
- win10连接filco蓝牙键盘