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.
A Tree Data Structure can be traversed in following ways:
- Depth First Search or DFS
- Inorder Traversal
- Preorder Traversal
- Postorder Traversal
- Level Order Traversal or Breadth First Search or BFS
- Boundary Traversal
- Diagonal Traversal
Tree Traversal
Inorder Traversal:
Algorithm Inorder(tree)
- Traverse the left subtree, i.e., call Inorder(left->subtree)
- Visit the root.
- Traverse the right subtree, i.e., call Inorder(right->subtree)
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.
Code implementation of Inorder traversal.
C
// C program for different tree traversals#include <stdio.h>#include <stdlib.h>// A binary tree node has data, pointer to left child// and a pointer to right childstruct node { int data; struct node* left; struct node* right;};// Helper function that allocates a new node with the// given data and NULL left and right pointers.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);}// Given a binary tree, print its nodes in inordervoid printInorder(struct node* node){ if (node == NULL) return; // First recur on left child printInorder(node->left); // Then print the data of node printf("%d ", node->data); // Now recur on right child printInorder(node->right);}// Driver codeint main(){ struct node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call printf("Inorder traversal of binary tree is \n"); printInorder(root); getchar(); return 0;} |
C++
// C++ program for different tree traversals#include <bits/stdc++.h>using namespace std;// A binary tree node has data, pointer to left child// and a pointer to right childstruct Node { int data; struct Node *left, *right;};// Utility function to create a new tree nodeNode* newNode(int data){ Node* temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp;}// Given a binary tree, print its nodes in inordervoid printInorder(struct Node* node){ if (node == NULL) return; // First recur on left child printInorder(node->left); // Then print the data of node cout << node->data << " "; // Now recur on right child printInorder(node->right);}// Driver codeint main(){ struct Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call cout << "Inorder traversal of binary tree is \n"; printInorder(root); return 0;} |
Java
// Java program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { int key; Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print its nodes in inorder void printInorder(Node node) { if (node == null) return; // First recur on left child printInorder(node.left); // Then print the data of node System.out.print(node.key + " "); // Now recur on right child printInorder(node.right); } // Driver code 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); // Function call System.out.println( "Inorder traversal of binary tree is "); tree.printInorder(tree.root); }} |
Python3
# Python3 program to for tree traversals# A class that represents an individual node in a# Binary Treeclass Node: def __init__(self, key): self.left = None self.right = None self.val = key# A function to do inorder tree traversaldef printInorder(root): if root: # First recur on left child printInorder(root.left) # Then print the data of node print(root.val, end=" "), # Now recur on right child printInorder(root.right)# Driver codeif __name__ == "__main__": root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) # Function call print("Inorder traversal of binary tree is") printInorder(root) |
C#
// C# program for different// tree traversalsusing System;// Class containing left and right child of// current node and key valueclass Node { public int key; public Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print // its nodes in inorder void printInorder(Node node) { if (node == null) return; // First recur on left child printInorder(node.left); // Then print the data of node Console.Write(node.key + " "); // Now recur on right child printInorder(node.right); } // Wrappers over above recursive functions void printInorder() { printInorder(root); } // Driver Code static public 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); // Function call Console.WriteLine("Inorder traversal " + "of binary tree is "); tree.printInorder(); }}// This code is contributed by Arnab Kundu |
Javascript
// javascript program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { constructor(val) { this.key = val; this.left = null; this.right = null; }}// Root of Binary Treevar root = null; // Given a binary tree, print its nodes in inorderfunction printInorder(node) { if (node == null) return; // First recur on left child */ printInorder(node.left); // Then print the data of node console.log(node.key + " "); // Now recur on right child printInorder(node.right);}// Driver method 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); console.log("Inorder traversal of binary tree is "); printInorder(root);// This code is contributed by aashish1995 |
Inorder traversal of binary tree is 4 2 5 1 3
Time Complexity: O(N)
Auxiliary Space: If we don’t consider the size of the stack for function calls then O(1) otherwise O(h) where h is the height of the tree.
Preorder Traversal:
Algorithm Preorder(tree)
- Visit the root.
- Traverse the left subtree, i.e., call Preorder(left->subtree)
- Traverse the right subtree, i.e., call Preorder(right->subtree)
Uses of Preorder:
Preorder traversal is used to create a copy of the tree. Preorder traversal is also used to get prefix expressions on an expression tree.
Code implementation of Preorder traversal:
C
// C program for different tree traversals#include <stdio.h>#include <stdlib.h>// A binary tree node has data, pointer to left child// and a pointer to right childstruct node { int data; struct node* left; struct node* right;};// Helper function that allocates a new node with the// given data and NULL left and right pointers.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);}// Given a binary tree, print its nodes in preordervoid printPreorder(struct node* node){ if (node == NULL) return; // First print data of node printf("%d ", node->data); // Then recur on left subtree printPreorder(node->left); // Now recur on right subtree printPreorder(node->right);}// Driver codeint main(){ struct node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call printf("Preorder traversal of binary tree is \n"); printPreorder(root); getchar(); return 0;} |
C++
// C++ program for different tree traversals#include <bits/stdc++.h>using namespace std;// A binary tree node has data, pointer to left child// and a pointer to right childstruct Node { int data; struct Node *left, *right;};// Utility function to create a new tree nodeNode* newNode(int data){ Node* temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp;}// Given a binary tree, print its nodes in preordervoid printPreorder(struct Node* node){ if (node == NULL) return; // First print data of node cout << node->data << " "; // Then recur on left subtree printPreorder(node->left); // Now recur on right subtree printPreorder(node->right);}// Driver codeint main(){ struct Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call cout << "Preorder traversal of binary tree is \n"; printPreorder(root); return 0;} |
Java
// Java program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { int key; Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print its nodes in preorder void printPreorder(Node node) { if (node == null) return; // First print data of node System.out.print(node.key + " "); // Then recur on left subtree printPreorder(node.left); // Now recur on right subtree printPreorder(node.right); } // Driver code 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); // Function call System.out.println( "Preorder traversal of binary tree is "); tree.printPreorder(tree.root); }} |
Python3
# Python3 program to for tree traversals# A class that represents an individual node# in a Binary Treeclass Node: def __init__(self, key): self.left = None self.right = None self.val = key# A function to do preorder tree traversaldef printPreorder(root): if root: # First print the data of node print(root.val, end=" "), # Then recur on left child printPreorder(root.left) # Finally recur on right child printPreorder(root.right)# Driver codeif __name__ == "__main__": root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) # Function call print("Preorder traversal of binary tree is") printPreorder(root) |
C#
// C# program for different// tree traversalsusing System;// Class containing left and right child of// current node and key valueclass Node { public int key; public Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print // its nodes in preorder void printPreorder(Node node) { if (node == null) return; // First print data of node Console.Write(node.key + " "); // Then recur on left subtree printPreorder(node.left); // Now recur on right subtree printPreorder(node.right); } // Driver Code static public 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); // Function call Console.WriteLine("Preorder traversal " + "of binary tree is "); tree.printPreorder(tree.root); }}// This code is contributed by Arnab Kundu |
Javascript
// javascript program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { constructor(val) { this.key = val; this.left = null; this.right = null; }}// Root of Binary Treevar root = null;// Given a binary tree, print its nodes in preorderfunction printPreorder(node) { if (node == null) return; // First print data of node document.write(node.key + " "); // Then recur on left subtree printPreorder(node.left); // Now recur on right subtree printPreorder(node.right);}// Driver method 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); console.log("Preorder traversal of binary tree is "); printPreorder(root);// This code is contributed by aashish1995 |
Preorder traversal of binary tree is 1 2 4 5 3
Time Complexity: O(N)
Auxiliary Space: If we don’t consider the size of the stack for function calls then O(1) otherwise O(h) where h is the height of the tree.
Postorder Traversal:
Algorithm Postorder(tree)
- Traverse the left subtree, i.e., call Postorder(left->subtree)
- Traverse the right subtree, i.e., call Postorder(right->subtree)
- Visit the root
Uses of Postorder:
Postorder traversal is used to delete the tree. Please see the question for the deletion of a tree for details. Postorder traversal is also useful to get the postfix expression of an expression tree
Below is the implementation of the above traversal methods:
C
// C program for different tree traversals#include <stdio.h>#include <stdlib.h>// A binary tree node has data, pointer to left child// and a pointer to right childstruct node { int data; struct node* left; struct node* right;};// Helper function that allocates a new node with the// given data and NULL left and right pointers.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);}// Given a binary tree, print its nodes according to the// "bottom-up" postorder traversal.void printPostorder(struct node* node){ if (node == NULL) return; // First recur on left subtree printPostorder(node->left); // Then recur on right subtree printPostorder(node->right); // Now deal with the node printf("%d ", node->data);}// Driver codeint main(){ struct node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call printf("Postorder traversal of binary tree is \n"); printPostorder(root); getchar(); return 0;} |
C++
// C++ program for different tree traversals#include <bits/stdc++.h>using namespace std;// A binary tree node has data, pointer to left child// and a pointer to right childstruct Node { int data; struct Node *left, *right;};// Utility function to create a new tree nodeNode* newNode(int data){ Node* temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp;}// Given a binary tree, print its nodes according to the// "bottom-up" postorder traversal.void printPostorder(struct Node* node){ if (node == NULL) return; // First recur on left subtree printPostorder(node->left); // Then recur on right subtree printPostorder(node->right); // Now deal with the node cout << node->data << " ";}// Driver codeint main(){ struct Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); // Function call cout << "Postorder traversal of binary tree is \n"; printPostorder(root); return 0;} |
Java
// Java program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { int key; Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print its nodes according to the // "bottom-up" postorder traversal. void printPostorder(Node node) { if (node == null) return; // First recur on left subtree printPostorder(node.left); // Then recur on right subtree printPostorder(node.right); // Now deal with the node System.out.print(node.key + " "); } // Driver code 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); // Function call System.out.println( "Postorder traversal of binary tree is "); tree.printPostorder(tree.root); }} |
Python3
# Python3 program to for tree traversals# A class that represents an individual node# in a Binary Treeclass Node: def __init__(self, key): self.left = None self.right = None self.val = key# A function to do postorder tree traversaldef printPostorder(root): if root: # First recur on left child printPostorder(root.left) # The recur on right child printPostorder(root.right) # Now print the data of node print(root.val, end=" "),# Driver codeif __name__ == "__main__": root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) # Function call print("Postorder traversal of binary tree is") printPostorder(root) |
C#
// C# program for different// tree traversalsusing System;// Class containing left and right child// of current node and key valueclass Node { public int key; public Node left, right; public Node(int item) { key = item; left = right = null; }}class BinaryTree { // Root of Binary Tree Node root; BinaryTree() { root = null; } // Given a binary tree, print its nodes according to // the "bottom-up" postorder traversal. void printPostorder(Node node) { if (node == null) return; // First recur on left subtree printPostorder(node.left); // Then recur on right subtree printPostorder(node.right); // Now deal with the node Console.Write(node.key + " "); } // Driver Code static public 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); // Function call Console.WriteLine("Postorder traversal " + "of binary tree is "); tree.printPostorder(tree.root); }}// This code is contributed by Arnab Kundu |
Javascript
// javascript program for different tree traversals// Class containing left and right child of current// node and key valueclass Node { constructor(val) { this.key = val; this.left = null; this.right = null; }}// Root of Binary Treevar root = null; // Given a binary tree, print its nodes according // to the "bottom-up" postorder traversalfunction printPostorder(node) { if (node == null) return; // First recur on left subtree printPostorder(node.left); // Then recur on right subtree printPostorder(node.right); // Now deal with the node console.log(node.key + " ");}// Driver method 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); console.log("Postorder traversal of binary tree is "); printPostorder(root);// This code is contributed by aashish1995 |
Postorder traversal of binary tree is 4 5 2 3 1
Some other Tree Traversals Techniques:
Some of the other tree traversals are:
Level Order Treversal
For each node, first, the node is visited and then it’s child nodes are put in a FIFO queue. Then again the first node is popped out and then it’s child nodes are put in a FIFO queue and repeat until queue becomes empty.
Example:
Input:
Level Order Treversal:
1
2 3
4 5
Boundary Traversal
The Boundary Traversal of a Tree includes:
- left boundary (nodes on left excluding leaf nodes)
- leaves (consist of only the leaf nodes)
- right boundary (nodes on right excluding leaf nodes)
Diagonal Traversal
In the Diagonal Traversal of a Tree, all the nodes in a single diagonal will be printed one by one.
Input :
Diagonal Traversal of binary tree:
8 10 14
3 6 7 13
1 4
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
