leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)
题目:
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
说明:
1)层序遍历,每层单独输出,顺序:从上到下,从左到右(思考:从下到上,从右到左如何?下面会说明)
2)实现也分递归和迭代,其中迭代贴出了两种实现(思想基本相同)
实现:
一、递归实现
/**
* Definition for binary tree
* 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>> result;
traverse(root,,result);
return result;
}
void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)
{
if(root==nullptr) return;
if(level>result.size()) result.push_back(vector<int>());
result[level-].push_back(root->val);
traverse(root->left,level+,result);
traverse(root->right,level+,result);
}
}; 二、迭代实现
a 迭代实现1
/**
* Definition for binary tree
* 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>> vec_vec_tree;//创建空vector,存放最后返回的遍历二叉树的值
vector<int> level;//创建空的vector,存放每一层的遍历二叉树的值
TreeNode *p=root;
if(p==nullptr) return vec_vec_tree;//如果二叉树空,返回空vector<vector<int>>
queue<TreeNode *> queue_tree;//创建一个空队列
queue_tree.push(p);//root节点入队列
queue_tree.push(nullptr);//空节点入队列
while(!queue_tree.empty())//直到队列为空
{
p=queue_tree.front(); //头结点取值,并出队列
queue_tree.pop();
if(p==nullptr&&!level.empty())//节点为空并且队列不为空
{
queue_tree.push(nullptr);//入队空节点,与下一层隔开
vec_vec_tree.push_back(level);//已遍历的层入队
level.clear();//清空vecor level
}
else if(p!=nullptr)//如果节点不空
{
level.push_back(p->val);//遍历
if(p->left) queue_tree.push(p->left);//若有左右孩子,则入队列
if(p->right) queue_tree.push(p->right);//注意入队顺序:先左后右
} }
return vec_vec_tree;
}
};
b 迭代实现2
/**
* Definition for binary tree
* 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> > result;
if(root == nullptr) return result;
queue<TreeNode*> current, next;//两个队列,保存当层(current)和下层(next)节点
vector<int> level; // 存放每层的节点值
current.push(root);
while (!current.empty())//直到二叉树遍历完成
{
while (!current.empty())//直到本层二叉树遍历完成
{
TreeNode* node = current.front();//取队首节点,出队列
current.pop();
level.push_back(node->val);//访问节点值
if (node->left != nullptr) next.push(node->left);//若存在左右节点,则压入next队列中
if (node->right != nullptr) next.push(node->right);//注意入队顺序为先left后right
}
result.push_back(level);//压入总vector
level.clear();//清vector
swap(next, current);//next队列和current队列交换
}
return result;
}
};
最后说明:如果 从下到上,从右到左如何遍历,如何实现
我的想法:从下到上,直接把结果vector<vector<int>>逆序即可
从右到左,把入队顺序改为先右后左即可
leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)的更多相关文章
- 【LeetCode】102. Binary Tree Level Order Traversal 二叉树的层序遍历 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS 日期 题目地址:https://lee ...
- 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, ...
- leetcode 102.Binary Tree Level Order Traversal 二叉树的层次遍历
基础为用队列实现二叉树的层序遍历,本题变体是分别存储某一层的元素,那么只要知道,每一层的元素都是上一层的子元素,那么只要在while循环里面加个for循环,将当前队列的值(即本层元素)全部访问后再执行 ...
- 【LeetCode】Binary Tree Level Order Traversal(二叉树的层次遍历)
这道题是LeetCode里的第102道题. 题目要求: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15 ...
- [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] 314. Binary Tree Vertical Order Traversal 二叉树的垂直遍历
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- LeetCode 102. Binary Tree Level Order Traversal02. 二叉树的层次遍历 (C++)
题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...
- Binary Tree Level Order Traversal II(层序遍历2)
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- Leetcode 102 Binary Tree Level Order Traversal 二叉树+BFS
二叉树的层次遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...
随机推荐
- UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)
题意:给定 n 个区间,让你选出最多的区间,使得每个区间不相交. 析:贪心题,贪心策略是按右端点排序,然后按着选即可. 代码如下: #pragma comment(linker, "/STA ...
- UVALive 6692 Lucky Number (思路 + 枚举)
题意:给你n 个数字,某一个数的幸运数是这个数前面比他小 离他最远的位置之差,求出最大幸运值. 析:先按从大到小排序,然后去维护那个最大的id,一直比较,更新最大值就好. 代码如下: #pragma ...
- Spring REST实践之Error Handling
Error Responses 在REST API中,HTTP状态码有非常重要的作用.API开发者应该坚持为每一个请求返回一个正确合适的状态码,而且应该在响应body中包含有用的.细粒度的错误信息.这 ...
- MySQL主从复制的原理及配置
[http://www.jb51.net/article/50053.htm] MySQL 数据库的高可用性架构: 集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单 ...
- non-manifold Mesh(非流形网格)
三角网格曲面中,大多的算法基于流形网格manifold mesh,其定义如下: 1)Each edge is incident to only one or two faces: 一条网格边为一个或两 ...
- libcurl API:CURLOPT_REFERER的用法
1.当你用libcurlAPI来请求某些数据时,发现返回的数据是0,这时候你就要去尝试用CURLOPT_REFERER来伪造一个来路页面:具体设置什么值可以通过浏览器来获取:按f12,在network ...
- 【转】如何分析解决Android ANR
来自: http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/detail ...
- 哈希表(Hash)的应用
$hs=@() #定义数组 $hs=@{} #定义Hash表,使用哈希表的键可以直接访问对应的值,如 $hs["王五"] 或者 $hs.王五 的值为 75 $hs=@''@ #定义 ...
- YOUYOU深入学习Ganglia之三(gmetad的软件架构)
Ganglia这个东西,目前的情况是测试的多,真正在数据中心部署过的人少:使用的多,真正能了解其代码架构的人少.这里根据我的经验,分解一下ganglia的gmetad的软件架构,欢迎大家交流. 上面的 ...
- 关于C#资源文件操作的总结
// 在这里,我来总结一下关于资源文件的相关操作. //1. 比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 // 比较典型的做法是通过代码程序集加载指定资源 // 如下通过Assemb ...