二叉树专题-lintcode二叉树的层序遍历
2017-10-19 17:46
323 查看
层序遍历算是遍历方式中,比较容易掌握的,实质就是宽度优先遍历,BFS的基本代码块如下;
void BFS(){
创建队列
第一个元素入队
while(队列非空){
取队首元素top
出队
访问top
下一层的元素按顺序入队
}
}
放到二叉树的遍历中来看,首先根节点入队,根出队,访问根节点,再入队左孩子,入队右孩子;这样再出队时,就是访问的第二层的左侧......以此类推
我们来看看题目考察的方式
由以上的分析,容易想到先取到这一层的元素的个数,然后在里面加一层循环即可
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
queue<TreeNode *> q;
vector<vector<int>> result;
if(root==NULL) return result;
if(root){//不为空则入队
q.push(root);
while(!q.empty()){
vector<int> oneLevel;
int size = q.size();
for(int i=0;i<size;++i){
TreeNode *node=q.front();
q.pop();
oneLevel.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right)q.push(node->right);
}
result.push_back(oneLevel);
}
}
return result;
}
再来看看其他的要求:
第一道要求,返回从下往上遍历的结果;我们只需要按照最初的从上向下的遍历,得到[ [3],[9,20],[15,7] ]后reverse一下即可
第二道题要求锯齿形的遍历,先从左往右,后从右往左,故只需要设置一个标志位,当从右往左时,我们对这一层的结果reverse即可
给出锯齿形遍历的代码:
vector<vector<int>> zigzagLevelOrder(TreeNode * root) {
// write your code here
vector<vector<int>> result;
if(!root) return result;
queue<TreeNode*> q;
q.push(root);
bool leftToRight=true;
while(!q.empty()){
vector<int> oneLevel;
int size=q.size();
for(int i=0;i<size;++i){
TreeNode* node=q.front();
q.pop();
oneLevel.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
if(!leftToRight) reverse(oneLevel.begin(),oneLevel.end());
result.push_back(oneLevel);
leftToRight=!leftToRight;
}
return result;
}
void BFS(){
创建队列
第一个元素入队
while(队列非空){
取队首元素top
出队
访问top
下一层的元素按顺序入队
}
}
放到二叉树的遍历中来看,首先根节点入队,根出队,访问根节点,再入队左孩子,入队右孩子;这样再出队时,就是访问的第二层的左侧......以此类推
我们来看看题目考察的方式
由以上的分析,容易想到先取到这一层的元素的个数,然后在里面加一层循环即可
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
queue<TreeNode *> q;
vector<vector<int>> result;
if(root==NULL) return result;
if(root){//不为空则入队
q.push(root);
while(!q.empty()){
vector<int> oneLevel;
int size = q.size();
for(int i=0;i<size;++i){
TreeNode *node=q.front();
q.pop();
oneLevel.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right)q.push(node->right);
}
result.push_back(oneLevel);
}
}
return result;
}
再来看看其他的要求:
第一道要求,返回从下往上遍历的结果;我们只需要按照最初的从上向下的遍历,得到[ [3],[9,20],[15,7] ]后reverse一下即可
第二道题要求锯齿形的遍历,先从左往右,后从右往左,故只需要设置一个标志位,当从右往左时,我们对这一层的结果reverse即可
给出锯齿形遍历的代码:
vector<vector<int>> zigzagLevelOrder(TreeNode * root) {
// write your code here
vector<vector<int>> result;
if(!root) return result;
queue<TreeNode*> q;
q.push(root);
bool leftToRight=true;
while(!q.empty()){
vector<int> oneLevel;
int size=q.size();
for(int i=0;i<size;++i){
TreeNode* node=q.front();
q.pop();
oneLevel.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
if(!leftToRight) reverse(oneLevel.begin(),oneLevel.end());
result.push_back(oneLevel);
leftToRight=!leftToRight;
}
return result;
}
相关文章推荐
- LeetCode | Binary Tree Level Order Traversal II(二叉树层序遍历II)
- 二叉树的遍历转换(层序,中序转先序)
- 二叉树的遍历——前序,中序,后序,层序
- 二叉树的层序遍历(levelordertraverse)
- 二叉树的层序遍历
- 二叉树层序遍历
- 二叉树,区分子节点和父节点的层序遍历
- 由二叉树的先序和中序遍历生成二叉树的层序和后序遍历结构
- 遍历二叉树(四种方式:前序、中序、后序、层序)
- 剑指Offer23 : 从上而下打印二叉树--层序遍历
- 二叉树的层序遍历
- 二叉树层序遍历
- 二叉树的层序遍历
- 【数据结构与算法】二叉树的层序遍历
- 实现一颗二叉树的层序遍历
- C语言二叉树的层序遍历
- 面试题23:从上往下打印二叉树(层序遍历) && 面试题25:二叉树中和为某一值的路径
- 数据结构实验之二叉树五:层序遍历(二叉树+队列)
- Binary Tree Level Order Traversal 二叉树的层序遍历
- Binary Tree Level Order Traversal 二叉树的层序遍历