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/