102. Binary Tree Level Order Traversal
1. Description
Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
2. Example
Example 1

Input: root = [3,9,20,null,null,15,7]
Output: [[3],[9,20],[15,7]]
Example 2
Input: root = [1]
Output: [[1]]
Example 3
Input: root = []
Output: []
3. Constraints
- The number of nodes in the tree is in the range [0, 2000].
- -1000 <= Node.val <= 1000
4. Solutions
Depth-first Search
n is the number of nodes in root
Time complexity: O(n)
Space complexity: O(logn->n)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode *root) {
vector<vector<int>> nodes;
traverse(root, 0, nodes);
return nodes;
}
private:
void traverse(TreeNode *root, int level, vector<vector<int>> &nodes) {
if (root != nullptr) {
if (nodes.size() == level) {
nodes.emplace_back();
}
nodes[level].push_back(root->val);
traverse(root->left, level + 1, nodes);
traverse(root->right, level + 1, nodes);
}
}
};
Breadth-first Search
n is the number of nodes in root
Time complexity: O(n)
Space complexity: O(w)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode *root) {
if (root == nullptr) {
return {};
}
vector<vector<int>> level_values;
queue<TreeNode *> nodes{{root}};
while (!nodes.empty()) {
const int n = nodes.size();
vector<int> values;
values.reserve(n);
for (int i = 0; i < n; ++i) {
auto node = nodes.front();
nodes.pop();
if (node->left != nullptr) {
nodes.push(node->left);
}
if (node->right != nullptr) {
nodes.push(node->right);
}
values.push_back(node->val);
}
level_values.push_back(move(values));
}
return level_values;
}
};