1、题目
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
2、思路
(BFS) O(n)
我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。
这样我们会:
- 先扩展根节点;
- 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点;
- 再依次从左到右扩展第三层节点;
- 依次类推
然后在遍历过程中我们给每一层加一个结尾标记NULL
,当我们访问到一层的结尾时,由于BFS
的特点,我们刚好把下一层都加到了队列中。这个时候就可以给这层加上结尾标记NULL
了,每次遍历到一层的结尾NULL
时,就将这一层添加到结果中。
3、代码
/**
* 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>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>>res;
if(!root) return res;
queue<TreeNode*>q;
vector<int>level; //记录一层的节点
q.push(root);
q.push(NULL);// 一层的结尾标记
while(q.size())
{
auto t = q.front();
q.pop();
if(!t)
{
if(!level.size()) break;
res.push_back(level);
level.clear();
q.push(NULL);
}
else
{
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return res;
}
};
原题链接:33. 搜索旋转排序数组