题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val; node 所携带的information
* TreeNode *left; 表示每一個node有两個pointer指向child
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
/* 思路:
1.先建一个队列,再建一个二维数组
2.把根节点放进队列
3.当队列不为空时取出队列的元素(节点),并把节点值放到列表L。
4.继续把节点的左右子孩扔入队列。
本题用到的向量容器的基本函数:
front():最先插入的元素;
pop():移除的第一个元素;
back():返回容器末尾元素的引用
push_back(const T& x):向量尾部增加一个元素X
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) { //二维数组 层序 root存取整棵樹的起點
//1.
vector<vector<int>> ret; //建一个二维数组ret,ret的每个元素都是vector<int>(整数向量)类型
if(!root){
return ret; //如果根节点为空,返回这个数组
}
queue <TreeNode*> q; //建一个队列q
//2.
q.push(root); //将根节点加入到队列中
//3.
while (!q.empty()){ //队列不为空 在这个循环内
int currentLevelSize = q.size(); //当前层队列长度
ret.push_back(vector<int>()); //给二维数组尾部加入一维数组
for(int i = 1;i <= currentLevelSize;++i){
auto node = q.front();q.pop(); //从队列中删除第一个元素
ret.back().push_back(node->val);//返回二维数组最后一行数组的值
//4.
//从左到右的顺序压进队列,出队的顺序也是从左往右
if(node->left){ //左节点不为空
q.push(node->left); //将左节点值压进队列
}
if(node->right){ //右节点不为空
q.push(node->right); //将右节点值压进队列
}
}
}
return ret;
}
};
-
向量容器的部分基本函数:
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据