二叉树?层次遍历!
题目:
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例子:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
题目分析
层次遍历
- 从上到下
- 从左到右
按顺序保存每个结点 --> 队列(先进先出)!
思路分析
变量 | 作用 |
---|---|
queue<TreeNode*> now | 保存现在遍历的层的所有结点 |
queue<TreeNode*> next | 保存要遍历的下一层的所有结点 |
TreeNode* temp | 当前遍历的结点 |
vector layer | 当前层的结点信息 |
过程:
设置两个队列 now 和 next
now 初始化为根结点
当 now 或 next 为非空
now非空
遍历now
now中结点的孩子结点 ==> 存储入next中
now中的结点存储入 layer
now如果为空
遍历next (即下一层)
next中结点的孩子结点 ==> 存储入now中
next中的结点存储入 layer
layer存储入ans
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return {};
queue<TreeNode*> now{{root}};
queue<TreeNode*> next;
vector<vector<int>> ans;
while (!now.empty()||!next.empty()) {
TreeNode* temp;
vector<int> layer;
if(!now.empty()) {
while (!now.empty()) { //遍历当前层
temp = now.front();
now.pop();
if(temp->left) next.push(temp->left); //孩子结点存储入下一层
if(temp->right) next.push(temp->right);
layer.push_back(temp->val);
}
}
else {
while (!next.empty()) {
temp = next.front();
next.pop();
if(temp->left) now.push(temp->left);
if(temp->right) now.push(temp->right);
layer.push_back(temp->val);
}
}
ans.push_back(layer);
}
return ans;
}
};