队列 102 Binary Tree Level Order Traversal
队列的基本应用 - 广度优先遍历
1)树 : 层序遍历;
2)图:无权图的最短路径。


使用队列来实现二叉树的层序遍历,需要多关注一个层数的信息
/**
* 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> > res; //存储最终输出的二维列表
if(root == NULL)
return res;
queue< pair<TreeNode*, int> > q; //将当前结点与它在第几层成对
q.push(make_pair(root, ));
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
q.pop(); if(level == res.size()) //若相等则说明res中还不存在这一层,因为level从0开始计数,res从1开始
//这个结点在一个新的层中,在res中新加一层
res.push_back(vector<int>()); res[level].push_back(node->val); if(node->left)
q.push(make_pair(node->left, level+));
if(node->right)
q.push(make_pair(node->right, level+));
}
return res;
}
};
解法二:<推荐> 比解法一通用,更方便。
/**
* 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) {
if(!root)
return {};
vector<vector<int>> res;
queue<TreeNode* > q{{root}};
while(!q.empty()){
vector<int> oneLevel;
for(int i = q.size(); i>; i--){
//因为q的大小是会变的,所以i要从q.size()开始从大往小减
TreeNode* t = q.front();
q.pop();
oneLevel.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
res.push_back(oneLevel);
}
return res;
}
};


/**
* 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>> levelOrderBottom(TreeNode* root) {
if(!root)
return {};
vector<vector<int>> res;
queue<TreeNode* > q{{root}};
while(!q.empty()){
vector<int> oneLevel;
for(int i = q.size(); i>; i--){
TreeNode* t = q.front();
q.pop();
oneLevel.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
res.insert(res.begin(), oneLevel); //倒序插入
}
return res;
}
};


之形的意思是:第0行是从左到右遍历,第1行是从右到左遍历,以此类推,交叉往返的之字形的层序遍历。
这里需要注意的一点是:不能将某一层的左子树和右子树逆序插入,这样会导致下一层的顺序出错。而是应该在奇数层时将各个结点反向插入
/**
* 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>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > res;
if(!root)
return {};
queue<TreeNode* > q{{root}};
int j = ; //层数从0开始计数
while(!q.empty()){
vector<int> oneLevel;
for(int i=q.size(); i>; i--){
TreeNode* t = q.front();
q.pop(); if(j% == ){
oneLevel.push_back(t->val); //偶数层正向插入
}
else{
oneLevel.insert(oneLevel.begin(), t->val); //奇数层时反向插入
}
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
j++;
res.push_back(oneLevel);
}
return res;
}
};


即打印出二叉树每一行最右边的一个结点。使用队列来实现,遍历每层的结点时,把下一层的结点都存入队列中,则每当开始新一层结点的遍历之前,先把新一层最后一个结点值存到res中。
/**
* 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<int> rightSideView(TreeNode* root) {
vector<int> res;
if(!root) return {};
queue<TreeNode*> q{{root}};
while(!q.empty()){
res.push_back(q.back()->val); //将每层的最后一个结点保存到res中
for(int i=q.size(); i>; i--){
TreeNode* t = q.front();
q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
} return res;
}
};
队列 102 Binary Tree Level Order Traversal的更多相关文章
- 102. Binary Tree Level Order Traversal 广度优先遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- [刷题] 102 Binary Tree Level Order Traversal
要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...
- 【LeetCode】102. Binary Tree Level Order Traversal (2 solutions)
Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of its nodes ...
- leetcode 102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- 【LeetCode】102 - Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- Leetcode 102. Binary Tree Level Order Traversal(二叉树的层序遍历)
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历 C++
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- 102. Binary Tree Level Order Traversal (Tree, Queue; BFS)
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
随机推荐
- Linux文件系统操作命令
Linux文件系统操作命令 文件系统操作命令: 1. cat:可以显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件. 2. chgrp:用来改变文件或目录所属的用户组,命令的参数以 ...
- MySQL——explain性能分析的使用
用法:explain sql语句: id:查询的序号. ref:进行连接查询时,表得连接关系.可以通过上图看出. select_type:select查询的类型,主要是区别普通查询和联合查询.子查询之 ...
- 对于 yii2 高级模板 生成文件入口
安装的 advanced 模板web下是没有index.php 方法: 在advanced 目录下有个init.bat 应用程序 双击即可如下 查看advanced 目录 (刷新)如下 已有:
- Part8-不用内存怎么行_2440内存初始化lesson2
1.2440地址空间 先去找PCB原理图,看CPU引出的内存地址线和数据线的宽度. 说明内存的其实地址是0x30000000为起始地址. 初始化内存其实是去初始化存储器控制器,只有初始化好这个存储器控 ...
- WinAPI多线程
WIN32线程控制主要实现线程的创建.终止.挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数.在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C ...
- 7.python实现高效端口扫描器之nmap模块
对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块. 本片文章主要介绍nmap模块的两个常用类: PortScanner()类,实现一个nma ...
- DataTable与结构不同实体类之间的转换
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...
- wgs84坐标系与gcj02坐标系转换误差分布图 | Mapping the Error in Transformation between WGS84 and GCJ02 Coordinations
国际上通用的是wgs84坐标系,而我国对于境内的坐标进行了加密,采用了gcj02坐标系,或者称为火星坐标系.亢孟军老师带的一门课<多媒体电子地图设计>要求我们从wgs84坐标系转换为gcj ...
- cmake笔记
注:cmake . 当前文件夹(一个点) cmake .. 父目录(两个点) 例子一 一个经典的C程序,如何用cmake来进行构建程序呢? //main.c #include <stdi ...
- html5 video使用autoplay属性时,声音混乱
html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...