队列 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, ...
随机推荐
- 443. String Compression字符串压缩
[抄题]: Given an array of characters, compress it in-place. The length after compression must always b ...
- CMake代码示例
CMake代码示例(注:此文只贴了部分示例代码,详细文章见最后参考文章): 1.为工程和可执行文件指定一个版本号. 虽然可以在源代码中唯一指定它,但是在CMakeLists文件中指定它可以提供更好的灵 ...
- Django----Rest Framework框架
Django Rest Framework框架(10) - RESTful规范 1.API与用户的通信协议,总是使用HTTPs协议. 2.域名 https://api.example.com 尽量将A ...
- 如果你的资源贫乏,那么专注做好一件事将是你的唯一出路(no reading yet)
http://www.jianshu.com/p/8784f0fd7ab8/comments/1161511
- Entity Framework 6.0 Tutorials(4):Database Command Logging
Database Command Logging: In this section, you will learn how to log commands & queries sent to ...
- 实践作业3:白盒测试----小组分工讨论DAY2
白盒测试需要通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致.我们小组在下课时候,在东九教学楼教师休息室进行了 ...
- (BST)升序数组变为BST树
题目:给定一个数组,其中元素按升序排序,将其转换为高度平衡BST. 思路:因为是升序数组,那么中间的数字一定是根节点值,然后在对左右两边的数组进行查找根节点的递归.一次处理左右子树. /** * De ...
- mysql数据库学习小结
数据库的学习可以从以下几个层次了解掌握,这样思路清晰后后面不管怎么变化都可以随时应变: 1.mysql基础知识 2.操作数据库的方法,增 删 改 查 3.jdbc连接数据库,工作原理 难点重点,如:P ...
- 我用Django搭网站(2)-QQ登录
接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 第一步:准备阶段 打开QQ互联,并登录你的QQ账号.再点击导航上的" ...
- HTML <area> 标签区域map标签
1.距形:(左上角顶点坐标为(x1,y1),右下角顶点坐标为(x2,y2)) <area shape="rect" coords="x1,y1,x2,y2" ...