题目描述
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
-
树中节点数目在范围
[0, 2000]内 -
-1000 <= Node.val <= 1000
思路一
队列的先入先出天然适配树的层次遍历,
- 从队列里面取一个元素出来,遍历它
- 然后依次将它的左孩子和右孩子(如有)入队,这样左右孩子就在一层了
- 下次遍历到左右孩子的时候,又会把孩子的孩子放到一层
- 这样就做到了层次遍历
// 循环
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if (!root) return ans;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
vector<int> vals;
// 小技巧:排空当前层,q若非空,肯定是上一层留下来的,
// 因为遍历过程中有元素入队,所以先记录当前size,只遍历属于当前层的节点
for (int n = q.size(); n--;) {
auto p = q.front();
q.pop();
vals.push_back(p->val);
if (p->left) q.push(p->left);
if (p->right) q.push(p->right);
}
ans.push_back(std::move(vals));
}
return ans;
}思路二
二叉树天然适配递归。
vector<vector<int>> levelOrder0(TreeNode* root) {
vector<vector<int>> ans;
// lambda静态捕获(since c++23)
auto tranverse = [&](this auto&& tranverse, TreeNode* p, int depth) {
if (!p) return;
if (ans.size() <= depth) {
ans.push_back(vector<int>());
}
ans[depth].push_back(p->val);
tranverse(p->left, depth + 1);
tranverse(p->right, depth + 1);
};
tranverse(root, 0);
return ans;
}这里是要返回一层一层的结果,如果只要按层次遍历依次输出(即所有元素铺开,只要一维 vector),则选用队列做更方便。
while (!q.empty()) {
auto p = q.front();
q.pop();
ans.push_back(p->val);
if (p->left) q.push(p->left);
if (p->right) q.push(p->right);
}see alse 二叉树的层次遍历