给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[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;
* 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>> res;
queue<TreeNode*> q;
if(root == nullptr) return res;
q.push(root);
while(q.size()>0){
int s = q.size();
vector<int> level;
while(s--){
TreeNode* cur = q.front();
q.pop();
if(cur == nullptr) continue;
level.push_back(cur->val);
q.push(cur->left);
q.push(cur->right);
}
if(level.size()!=0) res.push_back(level);
}
return res;
}
};
层序遍历的模板,这里用的是BFS(广度优先搜索)
本题是让我们把二叉树的每一层节点放入到同一个列表中,最后返回各层的列表组成的总的列表。
可以使用 BFS 和 DFS 解决。
左边是BFS,按照层进行搜索;图右边是DFS,先一路走到底,然后再回头搜索。
BFS
- 如果不需要确定当前遍历到了哪一层,BFS模板如下。
while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未访问过:
queue.push(该节点)
- 如果要确定当前遍历到了哪一层,BFS模板如下。
这里增加了level表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未被访问过:
queue.push(该节点)
}
level ++;
上面两个是通用模板,在任何题目中都可以用,是要记住的!
本题要求二叉树的层次遍历,所以同一层的节点应该放在一起,故使用模板二。
使用队列保存每层的所有节点,每次把队列里的原先所有节点进行出队列操作,再把每个元素的非空左右子节点进入队列。因此即可得到每层的遍历。
/**
* 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>> res;
queue<TreeNode*> q;
if(root == nullptr) return res;
q.push(root);
while(q.size()>0){
int s = q.size();
vector<int> level;
while(s--){
TreeNode* cur = q.front();
q.pop();
if(cur == nullptr) continue;
level.push_back(cur->val);
q.push(cur->left);
q.push(cur->right);
}
if(level.size()!=0) res.push_back(level);
}
return res;
}
};
q内层循环每次存的就是一个结点的左右子结点