# Binary Tree Traversal
> Binary Tree $\rightarrow$ [Data Structure (II) - 01 Tree](/ijB4_IbKQsqFHa47-OTK6Q#Binary-Tree)
* Tree traversal: process of visiting each node in the tree exactly **once** in some order.
* visit: Reading or processing data in a node
# depth-first
Using recursion again. In the flowcharts below
* root( D ) means to read or process the data of root
* left( L ) means to vist the left subtree
* right( R ) means to vist the right subtree
## Preorder(DLR)
```mermaid
flowchart LR
root-->left-->right
```
## Inorder(LDR)
actual I use it when teaching print BST in the [Data Structure (II) - 01a Binary Search Tree](/CE4kP7jeT5GE7bb-zePLCA)
```mermaid
flowchart LR
left-->root-->right
```
## Postorder(LRD)
```mermaid
flowchart LR
left-->right-->root
```
## Implementaion
```cpp=
void preorder(Node* root){
if(root!=NULL){
cout<< root->data << " ";//D
preorder(root->left);//L
preorder(root->right);//R
}
}
void inorder(Node* root){
if(root!=NULL){
inorder(root->left);//L
cout<< root->data << " ";//D
inorder(root->right);//R
}
}
void postorder(Node* root){
if(root!=NULL){
postorder(root->left);//L
postorder(root->right);//R
cout<< root->data << " ";//D
}
}
```
# breadth-first
We will use the tree below as example:
```mermaid
flowchart
F-->D
F-->J
D-->B
D-->E
B-->A
J-->G
J-->K
G-->I
I-->H
```
## Level Order
At the beginning, we go tho first level (`L0`), visit every nodes in the level then we go to next level.
```mermaid
flowchart LR
F-->D-->J-->B-->E-->G-->K-->A-->I-->H
f(L0)-->d(L1)-->j(L1)-->b(L2)-->e(L2)-->g(L2)-->k(L2)-->a(L3)-->ia(L3)-->ha(L3)
```
But how do we vist `J` after visit `D`? There isn't any link between them. We can use queue to storage the nodes we should visit.
1. enqueue the root
2. do the process
3. **enqueue the children**
4. pop the root (the front)
5. visit the new front and go to the process 2
```mermaid
flowchart LR
l0(Queue)-->F
l1(Queue)-->D-->J
l2(Queue)-->B-->E-->G-->K
l3(Queue)-->A-->I-->H
```
```cpp
#include<queue>
```
```cpp=
void levelOrder(Node* root){
if(root!=NULL){
queue<Node*> nodes;
nodes.push(root);
while(!nodes.empty()){
if(nodes.front()!=NULL){
cout<<nodes.front()->data<<" ";
if(nodes.front()->left!=NULL){
nodes.push(nodes.front()->left);
}
if(nodes.front()->right!=NULL){
nodes.push(nodes.front()->right);
}
nodes.pop();
}
}
}
}
```