题目
链接:102. Binary Tree Level Order Traversal
思考过程
- 根据题目名字我理所应当地认为了就是考二叉树的层序遍历,但是看完输出格式,就能发现,输出的格式不一样,需要按照二叉树的层次来输出每一层的数据。
- 没关系,我们先把二叉树的层序遍历写一遍,就当复习一下。我们要利用队列来实现。
- 写完层序遍历,那我们就来考虑一下怎样按照格式输出吧!按照每一层一行输出,那我们怎样判断这个数是第几层的呢?于是,我就想到了用一个结构体,来存放数字和他所在的层。但是放进队列的其实是一个节点,因为我们需要他的左右节点的信息。那我们创建结构体岂不是就有点麻烦了。然后我捣腾半天,觉得太麻烦了,因为你还得去判断他到底是第几层的,然后放到哪一行向量里面。
- 然后我就去看了题解,他的思路就是我们每次将一层的数据入队后,我们就记录一下这一层有多少数据(也就是此时队列的长度),然后根据这个队列长度去循环,让下一层入队,这样就实现了将每一层的数据分开。
- 然后,我就提交了!但是,报错了,原因是少考虑了一种情况,那就是这棵树根本就没有数据的时候,也就是root == NULL。如果不单独考虑这钟情况,到入队的时候就会报错。
这个是按照队列长度的代码:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;//记录结果
vector<int> num;
if(root == NULL) return ans;
queue<TreeNode*> qu;
qu.push(root);
while(!qu.empty()){
int len = qu.size();
for(int i = 0; i < len; i++)
{
root = qu.front();
num.push_back(root->val);
qu.pop();
if(root->left != NULL) qu.push(root->left);
if(root->right != NULL) qu.push(root->right);
}
ans.push_back(num);
num.clear();
}
return ans;
}