题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
分析:
- 首先根结点入队
- 当队列不为空时
- 求当前队列长度si
- 依次从队列中取si个元素进行拓展,然后进入下一次迭代
它和 BFS 的区别在于 BFS 每次只取一个元素拓展,而这里每次取si个元素。在上述过程中的第i次迭代就得到了二叉树的第i层的si个元素。
循环不变式:第i次迭代前,队列中的所有元素就是第i层的所有元素,并且按照从左向右的顺序排列。
代码:
/**
* Definition for a binary tree node.
* 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> > mat;
queue<TreeNode*>q;
if(root) q.push(root);
while(!q.empty()){
vector<int >vec;
int size=q.size();
//不可写q.size(),因为for循环中会导致q.size不断变化
for(int i=0;i<size;i++){
TreeNode* top=q.front();
q.pop();
vec.push_back(top->val);
if(top->left) q.push(top->left);
if(top->right) q.push(top->right);
}
mat.push_back(vec);
}
return mat;
}
};