# 【LeetCode】102. Binary Tree Level Order Traversal
## Question link
[Link](https://leetcode.com/problems/binary-tree-level-order-traversal/description/)
## Intuition
> 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).
(給定一個二元樹的根,返回層序走訪過程中經過節點的數值,順序為左至右)
經典的樹走訪問題,此題目共二種解法
1. Recursive
2. Queue(FIFO) 先訪問先處理
## Approach
### Recursive
使用遞迴方式逐層往下訪問節點,並用Pre order(NLR)的順序向下訪問
1. 遇到 `NULL` 節點就直接返回
2. 如果當前深度等於結果向量的大小,則創建並添加一個新的空向量來表示該層
3. 將當前節點的值添加到對應深度的向量中
4. 遞迴處理左子樹,將深度加1
5. 遞迴處理右子樹,將深度加1
### Queue
使用Queue的FIFO特性來處理元素,Queue裡元素為該層的所有元素,由於每一次push到Queue都會是被訪問節點的左或右子樹,但是
1. 批次處理Queue裡面所有的元素,直到該層全部處理完畢
2. 批次處理完後將儲存的結果放到回傳向量中,並開始下層的訪問
## Complexity
- Time complexity: $O(n)$
- Space complexity: $O(n)$
## Code
### Solution 1 Recursive
```cpp!
class Solution {
public:
void solve(vector<vector<int>>& ans, TreeNode* root, int depth){
if (!root) return;
if (ans.size() == depth) {
ans.push_back(vector<int>());
}
ans[depth].push_back(root->val);
solve(ans, root->left, depth + 1);
solve(ans, root->right, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
solve(ans, root, 0);
return ans;
}
};
```
### Solution 2 Queue
```cpp!
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if (!root) return ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int size = q.size();
vector<int>l(size, 0);
for (int i = 0; i < size; i++) {
TreeNode* front = q.front();
q.pop();
l[i] = front->val;
if (front->left) q.push(front->left);
if (front->right) q.push(front->right);
}
ans.push_back(l);
}
return ans;
}
};
```