# 【LeetCode】 102. Binary Tree Level Order Traversal
## Description
> Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
> 給一個二元樹,按照階層遍歷回傳它每個節點的值。(從左到右,一層一層)
## Example:
```
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
```
## Solution
* 使用`BFS`去跑樹的結構即可。
* 用一個`queue`去存左子樹和右子樹,同時也去紀錄子樹的`level`。每次從`queue`裡面拿新的點來跑,直到`queue`為空。
* 下方的範例code其實越寫越冗,而且遞迴傳的參數太多,但整體概念和結構是對的。
### Code
```C++=1
/**
* 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:
void BFS(vector<vector<int>>& ans,vector<int>& nodes,vector<pair<TreeNode*,int>>& queue,int &level)
{
//take new node from queue
pair<TreeNode*,int> n = queue.front();
queue.erase(queue.begin());
if(!n.first)return;
//check level
if(level==n.second)
nodes.push_back(n.first->val);
else
{
level = n.second;
ans.push_back(nodes);
nodes.clear();
nodes.push_back(n.first->val);
}
//push next node into queue
queue.push_back(pair<TreeNode*,int>(n.first->left,n.second+1));
queue.push_back(pair<TreeNode*,int>(n.first->right,n.second+1));
//run until queue is empty
while(queue.size()!=0)
BFS(ans,nodes,queue,level);
//check last level is pushed
if(nodes.size()!=0)
{
ans.push_back(nodes);
nodes.clear();
}
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
vector<int> nodes;
int level=0;
vector<pair<TreeNode*,int>> queue(1,pair<TreeNode*,int>(root,0));
BFS(ans,nodes,queue,level);
return ans;
}
};
```
###### tags: `LeetCode` `C++`