Binary tree traversal: It is the process of visiting (or printing) all the nodes of the binary tree. There are three ways for tree traversal that are Pre-order, In-order, and Post-order.
| Pre-order | In-order | Post-order | 
|---|---|---|
| Process the root R. | Traverse the left subtree of R in preorder. | Traverse the left sub tree of R in postorder. | 
| Traverse the left subtree of R in preorder. | Process the root R. | Traverse the right subtree of R inorder. | 
| Traverse the right subtree of R in preorder | Traverse the right subtree of R inorder. | Process the root R. | 
C++ Program for Binary Tree Traversal in data structure
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
 
class Node{
public:
    Node* lchild;
    int data;
    Node* rchild;
    Node() {};
    Node(int data);
};
 
Node::Node(int data) {
    lchild = nullptr;
    this->data = data;
    rchild = nullptr;
}
 
class Tree{
private:
    Node* root;
public:
    Tree();
    void CreateTree();
    void Preorder(Node* p);
    void Preorder() { Preorder(root); }  // Passing Private Parameter in Constructor
    void Inorder(Node* p);
    void Inorder() { Inorder(root); }
    void Postorder(Node* p);
    void Postorder() { Postorder(root); }
    void Levelorder(Node* p);
    void Levelorder() { Levelorder(root); }
    int Height(Node* p);
    int Height() { return Height(root); }
    void iterativePreorder(Node* p);
    void iterativePreorder() { iterativePreorder(root); }
    void iterativeInorder(Node* p);
    void iterativeInorder() { iterativeInorder(root); }
    void iterativePostorder(Node* p);
    void iterativePostorder() { iterativePostorder(root); }
    Node* generateFromTraversal(int inorder[], int preorder[], int inStart, int inEnd);
};
 
Tree::Tree() {
    root = nullptr;
}
void Tree::CreateTree() {
    Node* p;
    Node* t;
    int x;
    queue<Node*> q;
 
    root = new Node;
    cout << "Enter root data: " << flush;
    cin >> x;
    root->data = x;
    root->lchild = nullptr;
    root->rchild = nullptr;  
    q.emplace(root);
 
    while (! q.empty()){
        p = q.front();
        q.pop();
 
        cout << "Enter left child data of " << p->data << ": " << flush;
        cin >> x;
        if (x != -1){
            t = new Node;
            t->data = x;
            t->lchild = nullptr;
            t->rchild = nullptr;
            p->lchild = t;
            q.emplace(t);
        }
 
        cout << "Enter right child data of " << p->data << ": " << flush;
        cin >> x;
        if (x != -1){
            t = new Node;
            t->data = x;
            t->lchild = nullptr;
            t->rchild = nullptr;
            p->rchild = t;
            q.emplace(t);
        }
    }
}
 
Binary tree traversal iterative
Preorder Traversal:
void Tree::iterativePreorder(Node *p) {
    stack<Node*> stk;
    while (p != nullptr || ! stk.empty()){
        if (p != nullptr){
            cout << p->data << ", " << flush;
            stk.push(p);
            p = p->lchild;
        } else {
            p = stk.top();
            stk.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}
 Inorder Traversal:
void Tree::iterativeInorder(Node *p) {
    stack<Node*> stk;
    while (p != nullptr || ! stk.empty()){
        if (p != nullptr){
            stk.push(p);
            p = p->lchild;
        } else {
            p = stk.top();
            stk.pop();
            cout << p->data << ", " << flush;
            p = p->rchild;
        }
    }
    cout << endl;
}
 Postorder Traversal:
void Tree::iterativePostorder(Node *p) {
    stack stk;
    long int temp;
    while (p != nullptr || ! stk.empty()){
        if (p != nullptr){
            stk.push((long int)p);
            p = p->lchild;
        } else {
            temp = stk.top();
            stk.pop();
            if (temp > 0){
                stk.push(-temp);
                p = ((Node*)temp)->rchild;
            } else {
                cout << ((Node*)(-1 * temp))->data << ", " << flush;
                p = nullptr;
            }
        }
    }
    cout << endl;
}
Recursive Binary tree traversal
void Tree::Preorder(Node *p) {
    if (p){
        cout << p->data << ", " << flush;
        Preorder(p->lchild);
        Preorder(p->rchild);
    }
}
 
void Tree::Inorder(Node *p) {
    if (p){
        Inorder(p->lchild);
        cout << p->data << ", " << flush;
        Inorder(p->rchild);
    }
}
 
void Tree::Postorder(Node *p) {
    if (p){
        Postorder(p->lchild);
        Postorder(p->rchild);
        cout << p->data << ", " << flush;
    }
}
Level order traversal
In this program, we will learn print level order traversal of a tree.
void Tree::Levelorder(Node *p) {
    queue<Node*> q;
    cout << p->data << ", " << flush;
    q.push(p);
 
    while (! q.empty()){
        p = q.front();
        q.pop();
 
        if (p->lchild){
            cout << p->lchild->data << ", " << flush;
            q.push(p->lchild);
        }
 
        if (p->rchild){
            cout << p->rchild->data << ", " << flush;
            q.push(p->rchild);
        }
    }
}
 
Reverse Level Order Traversal
vector<int> reverseLevelOrder(Node *p)
{
    
    vector<int> ans;
      if(!p)
      return ans;
      queue<Node *> q;
      q.push(p);
      Node * temp;
      while(!q.empty())
      {
          temp=q.front();
          q.pop();
          if(temp->right)
          q.push(temp->right);
          if(temp->left)
          q.push(temp->left);
          
          ans.push_back(temp->data);
      }
      reverse(ans.begin(),ans.end());
      return ans;
}
Binary Tree Zigzag Level Order Traversal
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(!root)
            return {};
        vector<vector<int>> ans;
        vector<int> v;
        int count=0;
        TreeNode* p;
        queue<TreeNode * > q;
        q.push(root);
        int size=0;
        while(!q.empty())
        {
            v.clear();
            count++;
            size=q.size();
           
            for(int i=0;i<size;i++)
            {
                 p=q.front();
                 q.pop();
                if(p->left)
                    q.push(p->left);
                if(p->right)
                    q.push(p->right);
                v.push_back(p->val);
                
            }
            if(count%2==0)
            {
                    reverse(v.begin(),v.end());
            }
            ans.push_back(v);
        }
        return ans;
    }
Vertical Traversal of Binary Tree
vector<int> verticalOrder(Node *root)
    {
        queue<pair<Node *,int>> q;
        vector<int> v;
        vector<vector<int>> ans;
        map<int,vector<int>> mp;
        q.push(make_pair(root,0));
        while(!q.empty())
        {
            pair<Node *,int> p=q.front();
            q.pop();
            Node  * temp=p.first;
            int pos=p.second;
            if(temp->left)
                q.push(make_pair(temp->left,pos-1));
            if(temp->right)
                q.push(make_pair(temp->right,pos+1));
            mp[pos].push_back(temp->data);
            
        }
        for(auto &pr:mp)
        {
            for(int i=0;i<pr.second.size();i++)
            {
                v.push_back(pr.second[i]);
            }
            
        }
        return v;
    }
Related leetcode problem: https://leetcode.com/problems/binary-tree-level-order-traversal/