描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]
思路一:
二叉树层遍历思路
- 1:定义一个队列
- 2:往队列中加入当前节点
- 3:当队列不为空实时进行以下两个操作
- 求出当前队列的长度len
- 取出队列前len个节点,每取出一个节点,就把对应节点的左右孩子入队(前提左右孩子不为空)
- 然后重复上面的过程
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/*
二叉树层遍历思路
1:定义一个队列
2:往队列中加入当前节点
3:当队列不为空实时进行以下两个操作
1) 求出当前队列的长度len
2)取出队列前len个节点,每取出一个节点,就把对应节点的左右孩子入队(前提左右孩子不为空)
然后重复上面的过程
*/
class Solution {
public:
/**
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > levelOrder(TreeNode* root) {
// write code here
vector<vector<int> > res; //定义用来返回值的
if(root == nullptr) return res; //用来返回值
queue<TreeNode* > q; //定义一个队列
q.push(root); //用来把头节点数据压入队列
while(!q.empty()){
vector<int> temp; //用来存储当前遍历这一层的节点
int n = q.size(); //获取当前这一层的大小,求队列长度
for(int i=0;i<n;i++){
TreeNode *node = q.front(); //取出队列的第一个元素
q.pop(); //把头数据弹出
temp.push_back(node->val); //把队头元素保存起来
if(node->left != NULL){
q.push(node->left); //左孩子不为空就进队列
}
if(node->right !=NULL){
q.push(node->right); //右孩子如果不为空就进队列
}
}
res.push_back(temp); //将这一层节点的数据保存到res中
}
return res;
}
};
用VS写一遍
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
//定义一个树
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int x):
val(x),left(NULL),right(NULL){
}
};
//定义层遍历的方法
vector<vector<int> > levelOrder(TreeNode* root) {
vector<vector<int> > res; //定义用来存储最终结果的
if (root == nullptr) return res; //当为空时候直接返回结果
queue<TreeNode*> q; //定义一个队列用来存节点数据
q.push(root); //把头节点压入队列
while (!q.empty()) { //循环判断
vector<int> temp; //定义一个临时的容器用来存一层的数据
int n = q.size(); //用来获取队列的长度
for (int i = 0; i < n;i++) {
TreeNode* node = q.front(); //取出队列的第一个元素
q.pop(); //取出的数据弹出队列
temp.push_back(node->val); //把队头数据保存
if (node->left != nullptr) q.push(node->left); //当左不为空,把左节点压入容器中
if (node->right != nullptr) q.push(node->right); //当右边节点不为空,把右节点压入容器
}
res.push_back(temp);
}
return res;
}
int main() {
//填充树的数据
TreeNode* A1 = new TreeNode(3);
TreeNode* A2 = new TreeNode(9);
TreeNode* A3 = new TreeNode(20);
TreeNode* A4 = new TreeNode(15);
TreeNode* A5 = new TreeNode(7);
A1->left = A2;
A1->right = A3;
A3->left = A4;
A3->right = A5;
vector<vector<int> > rslt; //定义返回的结果
rslt = levelOrder(A1);
for (int i = 0; i < rslt.size(); i++) { //获取行的大小
for (int j = 0; j < rslt[i].size(); j++) { //获取列的大小
cout << rslt[i][j]<<" "; //输出二维数组的数据
}
cout << endl; //输出换行
}
return 0;
}