Given a Binary tree, Traverse it using DFS using recursion.
Unlike linear data structures (Array, Linked List, Queues, Stacks, etc) which have only one logical way to traverse them, trees can be traversed in different ways.
Generally, there are 2 widely used ways for traversing trees:
- DFS or Depth-First Search
- BFS or Breadth-First Search
What is a Depth-first search?
DFS (Depth-first search) is a technique used for traversing trees or graphs. Here backtracking is used for traversal. In this traversal first, the deepest node is visited and then backtracks to its parent node if no sibling of that node exists
DFS Traversal of a Graph vs Tree:
In the graph, there might be cycles and disconnectivity. Unlike the graph, the tree does not contain a cycle and are always connected. So DFS of a tree is relatively easier. We can simply begin from a node, then traverse its adjacent (or children) without caring about cycles. And if we begin from a single node (root), and traverse this way, it is guaranteed that we traverse the whole tree as there is no dis-connectivity,
Examples:
Input Tree:
Therefore, the Depth First Traversals of this Tree will be:
- Inorder: 4 2 5 1 3
- Preorder: 1 2 4 5 3
- Postorder: 4 5 2 3 1
Below are the Tree traversals through DFS using recursion:
1. Inorder Traversal (Practice):
Follow the below steps to solve the problem:
- Traverse the left subtree, i.e., call Inorder(left-subtree)
- Visit the root
- Traverse the right subtree, i.e., call Inorder(right-subtree)
Below is the implementation of the above algorithm:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
Node( int data)
{
this ->data = data;
left = right = NULL;
}
};
void printInorder( struct Node* node)
{
if (node == NULL)
return ;
printInorder(node->left);
cout << node->data << " " ;
printInorder(node->right);
}
int main()
{
struct Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
cout << "\nInorder traversal of binary tree is \n" ;
printInorder(root);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* newNode( int data)
{
struct node* node
= ( struct node*) malloc ( sizeof ( struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
void printInorder( struct node* node)
{
if (node == NULL)
return ;
printInorder(node->left);
printf ( "%d " , node->data);
printInorder(node->right);
}
int main()
{
struct node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf ( "\nInorder traversal of binary tree is \n" );
printInorder(root);
getchar ();
return 0;
}
|
Java
class Node {
int key;
Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printInorder(Node node)
{
if (node == null )
return ;
printInorder(node.left);
System.out.print(node.key + " " );
printInorder(node.right);
}
void printInorder() { printInorder(root); }
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
System.out.println(
"\nInorder traversal of binary tree is " );
tree.printInorder();
}
}
|
Python
class Node:
def __init__( self , key):
self .left = None
self .right = None
self .val = key
def printInorder(root):
if root:
printInorder(root.left)
print (root.val),
printInorder(root.right)
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
print "\nInorder traversal of binary tree is"
printInorder(root)
|
C#
using System;
class Node {
public int key;
public Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
public class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printInorder(Node node)
{
if (node == null )
return ;
printInorder(node.left);
Console.Write(node.key + " " );
printInorder(node.right);
}
void printInorder() { printInorder(root); }
public static void Main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
Console.WriteLine(
"\nInorder traversal of binary tree is " );
tree.printInorder();
}
}
|
Javascript
<script>
class Node {
constructor(val) {
this .key = val;
this .left = null ;
this .right = null ;
}
}
function printInorder(node) {
if (node == null )
return ;
printInorder(node.left);
document.write(node.key + " " );
printInorder(node.right);
}
var root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
document.write( "<br/>Inorder traversal of binary tree is <br/>" );
printInorder(root);
</script>
|
Output
Inorder traversal of binary tree is
4 2 5 1 3
Time Complexity: O(N)
Auxiliary Space: O(log N)
Uses of Inorder traversal:
In the case of binary search trees (BST), Inorder traversal gives nodes in non-decreasing order. To get nodes of BST in non-increasing order, a variation of Inorder traversal where Inorder traversal is reversed can be used
2. Preorder Traversal (Practice):
Follow the below steps to solve the problem:
- Visit the root
- Traverse the left subtree, i.e., call Preorder(left-subtree)
- Traverse the right subtree, i.e., call Preorder(right-subtree)
Below is the implementation of the above algorithm:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
Node( int data)
{
this ->data = data;
left = right = NULL;
}
};
void printPreorder( struct Node* node)
{
if (node == NULL)
return ;
cout << node->data << " " ;
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
cout << "\nPreorder traversal of binary tree is \n" ;
printPreorder(root);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* newNode( int data)
{
struct node* node
= ( struct node*) malloc ( sizeof ( struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
void printPreorder( struct node* node)
{
if (node == NULL)
return ;
printf ( "%d " , node->data);
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf ( "\nPreorder traversal of binary tree is \n" );
printPreorder(root);
getchar ();
return 0;
}
|
Java
class Node {
int key;
Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPreorder(Node node)
{
if (node == null )
return ;
System.out.print(node.key + " " );
printPreorder(node.left);
printPreorder(node.right);
}
void printPreorder() { printPreorder(root); }
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
System.out.println(
"Preorder traversal of binary tree is " );
tree.printPreorder();
}
}
|
Python
class Node:
def __init__( self , key):
self .left = None
self .right = None
self .val = key
def printPreorder(root):
if root:
print (root.val),
printPreorder(root.left)
printPreorder(root.right)
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
print "Preorder traversal of binary tree is"
printPreorder(root)
|
C#
using System;
public class Node {
public int key;
public Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
public class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPreorder(Node node)
{
if (node == null )
return ;
Console.Write(node.key + " " );
printPreorder(node.left);
printPreorder(node.right);
}
void printPreorder() { printPreorder(root); }
public static void Main()
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
Console.WriteLine(
"Preorder traversal of binary tree is " );
tree.printPreorder();
}
}
|
Javascript
<script>
class Node{
constructor(key){
this .left = null
this .right = null
this .val = key
}
}
function printPreorder(root){
if (root){
document.write(root.val, " " )
printPreorder(root.left)
printPreorder(root.right)
}
}
let root = new Node(1)
root.left = new Node(2)
root.right = new Node(3)
root.left.left = new Node(4)
root.left.right = new Node(5)
document.write( "Preorder traversal of binary tree is" , "</br>" )
printPreorder(root)
</script>
|
Output
Preorder traversal of binary tree is
1 2 4 5 3
Time Complexity: O(N)
Auxiliary Space: O(log N)
Uses of Preorder:
Preorder traversal is used to create a copy of the tree. Preorder traversal is also used to get prefix expressions of an expression tree.
3. Postorder Traversal (Practice):
Follow the below steps to solve the problem:
- Traverse the left subtree, i.e., call Postorder(left-subtree)
- Traverse the right subtree, i.e., call Postorder(right-subtree)
- Visit the root
Below is the implementation of the above algorithm:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
Node( int data)
{
this ->data = data;
left = right = NULL;
}
};
void printPostorder( struct Node* node)
{
if (node == NULL)
return ;
printPostorder(node->left);
printPostorder(node->right);
cout << node->data << " " ;
}
int main()
{
struct Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
cout << "\nPostorder traversal of binary tree is \n" ;
printPostorder(root);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* newNode( int data)
{
struct node* node
= ( struct node*) malloc ( sizeof ( struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
void printPostorder( struct node* node)
{
if (node == NULL)
return ;
printPostorder(node->left);
printPostorder(node->right);
printf ( "%d " , node->data);
}
int main()
{
struct node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf ( "\nPostorder traversal of binary tree is \n" );
printPostorder(root);
getchar ();
return 0;
}
|
Java
class Node {
int key;
Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPostorder(Node node)
{
if (node == null )
return ;
printPostorder(node.left);
printPostorder(node.right);
System.out.print(node.key + " " );
}
void printPostorder() { printPostorder(root); }
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
System.out.println(
"\nPostorder traversal of binary tree is " );
tree.printPostorder();
}
}
|
Python
class Node:
def __init__( self , key):
self .left = None
self .right = None
self .val = key
def printPostorder(root):
if root:
printPostorder(root.left)
printPostorder(root.right)
print (root.val),
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
print "\nPostorder traversal of binary tree is"
printPostorder(root)
|
C#
using System;
public class Node {
public int key;
public Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
public class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPostorder(Node node)
{
if (node == null )
return ;
printPostorder(node.left);
printPostorder(node.right);
Console.Write(node.key + " " );
}
void printPostorder() { printPostorder(root); }
public static void Main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
Console.WriteLine(
"\nPostorder traversal of binary tree is " );
tree.printPostorder();
}
}
|
Javascript
<script>
class Node {
constructor(item) {
this .key = item;
this .left = this .right = null ;
}
}
var root;
function printPostorder(node) {
if (node == null )
return ;
printPostorder(node.left);
printPostorder(node.right);
document.write(node.key + " " );
}
root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
document.write( "\nPostorder traversal of binary tree is<br/> " );
printPostorder(root);
</script>
|
Output
Postorder traversal of binary tree is
4 5 2 3 1
Time Complexity: O(N)
Auxiliary Space: O(log N)
Uses of Postorder:
Postorder traversal is used to delete the tree. Please see the question for the deletion of the tree for details. Postorder traversal is also useful to get the postfix expression of an expression tree
Implementing all traversals using DFS:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
Node( int data)
{
this ->data = data;
left = right = NULL;
}
};
void printPostorder( struct Node* node)
{
if (node == NULL)
return ;
printPostorder(node->left);
printPostorder(node->right);
cout << node->data << " " ;
}
void printInorder( struct Node* node)
{
if (node == NULL)
return ;
printInorder(node->left);
cout << node->data << " " ;
printInorder(node->right);
}
void printPreorder( struct Node* node)
{
if (node == NULL)
return ;
cout << node->data << " " ;
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
cout << "\nPreorder traversal of binary tree is \n" ;
printPreorder(root);
cout << "\nInorder traversal of binary tree is \n" ;
printInorder(root);
cout << "\nPostorder traversal of binary tree is \n" ;
printPostorder(root);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* newNode( int data)
{
struct node* node
= ( struct node*) malloc ( sizeof ( struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
void printPostorder( struct node* node)
{
if (node == NULL)
return ;
printPostorder(node->left);
printPostorder(node->right);
printf ( "%d " , node->data);
}
void printInorder( struct node* node)
{
if (node == NULL)
return ;
printInorder(node->left);
printf ( "%d " , node->data);
printInorder(node->right);
}
void printPreorder( struct node* node)
{
if (node == NULL)
return ;
printf ( "%d " , node->data);
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf ( "\nPreorder traversal of binary tree is \n" );
printPreorder(root);
printf ( "\nInorder traversal of binary tree is \n" );
printInorder(root);
printf ( "\nPostorder traversal of binary tree is \n" );
printPostorder(root);
getchar ();
return 0;
}
|
Java
class Node {
int key;
Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPostorder(Node node)
{
if (node == null )
return ;
printPostorder(node.left);
printPostorder(node.right);
System.out.print(node.key + " " );
}
void printInorder(Node node)
{
if (node == null )
return ;
printInorder(node.left);
System.out.print(node.key + " " );
printInorder(node.right);
}
void printPreorder(Node node)
{
if (node == null )
return ;
System.out.print(node.key + " " );
printPreorder(node.left);
printPreorder(node.right);
}
void printPostorder() { printPostorder(root); }
void printInorder() { printInorder(root); }
void printPreorder() { printPreorder(root); }
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
System.out.println(
"Preorder traversal of binary tree is " );
tree.printPreorder();
System.out.println(
"\nInorder traversal of binary tree is " );
tree.printInorder();
System.out.println(
"\nPostorder traversal of binary tree is " );
tree.printPostorder();
}
}
|
Python
class Node:
def __init__( self , key):
self .left = None
self .right = None
self .val = key
def printInorder(root):
if root:
printInorder(root.left)
print (root.val),
printInorder(root.right)
def printPostorder(root):
if root:
printPostorder(root.left)
printPostorder(root.right)
print (root.val),
def printPreorder(root):
if root:
print (root.val),
printPreorder(root.left)
printPreorder(root.right)
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
print "Preorder traversal of binary tree is"
printPreorder(root)
print "\nInorder traversal of binary tree is"
printInorder(root)
print "\nPostorder traversal of binary tree is"
printPostorder(root)
|
C#
using System;
public class Node {
public int key;
public Node left, right;
public Node( int item)
{
key = item;
left = right = null ;
}
}
public class BinaryTree {
Node root;
BinaryTree() { root = null ; }
void printPostorder(Node node)
{
if (node == null )
return ;
printPostorder(node.left);
printPostorder(node.right);
Console.Write(node.key + " " );
}
void printInorder(Node node)
{
if (node == null )
return ;
printInorder(node.left);
Console.Write(node.key + " " );
printInorder(node.right);
}
void printPreorder(Node node)
{
if (node == null )
return ;
Console.Write(node.key + " " );
printPreorder(node.left);
printPreorder(node.right);
}
void printPostorder() { printPostorder(root); }
void printInorder() { printInorder(root); }
void printPreorder() { printPreorder(root); }
public static void Main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
Console.WriteLine(
"Preorder traversal of binary tree is " );
tree.printPreorder();
Console.WriteLine(
"\nInorder traversal of binary tree is " );
tree.printInorder();
Console.WriteLine(
"\nPostorder traversal of binary tree is " );
tree.printPostorder();
}
}
|
Javascript
<script>
class Node{
constructor(key){
this .left = null
this .right = null
this .val = key
}
}
function printInorder(root){
if (root){
printInorder(root.left)
document.write(root.val, " " )
printInorder(root.right)
}
}
function printPostorder(root){
if (root){
printPostorder(root.left)
printPostorder(root.right)
document.write(root.val, " " )
}
}
function printPreorder(root){
if (root){
document.write(root.val, " " )
printPreorder(root.left)
printPreorder(root.right)
}
}
let root = new Node(1)
root.left = new Node(2)
root.right = new Node(3)
root.left.left = new Node(4)
root.left.right = new Node(5)
document.write( "Preorder traversal of binary tree is" , "</br>" )
printPreorder(root)
document.write( "</br>" , "Inorder traversal of binary tree is" , "</br>" )
printInorder(root)
document.write( "</br>" , "Postorder traversal of binary tree is" , "</br>" )
printPostorder(root)
</script>
|
Output
Preorder traversal of binary tree is
1 2 4 5 3
Inorder traversal of binary tree is
4 2 5 1 3
Postorder traversal of binary tree is
4 5 2 3 1
Time Complexity: O(N)
Auxiliary Space: O(log N)
Related Article:
Please see this post for Breadth First Traversal.
Last Updated :
15 Feb, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...