Draw a Tree Recursion Java

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

In this article, traversal using DFS has been discussed. Please see this post for Breadth First Traversal.

Depth-first search

DFS (Depth-first search) is technique used for traversing tree or graph. Here backtracking is used for traversal. In this traversal first the deepest node is visited and then backtracks to it's parent node if no sibling of that node exist.

DFS Traversal of a Graph vs Tree

In graph, there might be cycles and dis-connectivity. Unlike graph, tree does not contain cycle and 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:

Tree:

Example Tree

Therefore, the Depth First Traversals of this Tree will be:
(a) Inorder (Left, Root, Right) : 4 2 5 1 3
(b) Preorder (Root, Left, Right) : 1 2 4 5 3
(c) Postorder (Left, Right, Root) : 4 5 2 3 1

Below are the Tree traversals through DFS using recursion:

1. Inorder Traversal (Practice):

Example: Inorder traversal for the above-given figure is 4 2 5 1 3.

Algorithm Inorder(tree)    1. Traverse the left subtree, i.e., call Inorder(left-subtree)    2. Visit the root.    3. Traverse the right subtree, i.e., call Inorder(right-subtree)

Implementation:

C++

#include <iostream>

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

Uses of Inorder:
In 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 s reversed can be used.

2. Preorder Traversal (Practice):

Example: Preorder traversal for the above given figure is 1 2 4 5 3.

Algorithm Preorder(tree)    1. Visit the root.    2. Traverse the left subtree, i.e., call Preorder(left-subtree)    3. Traverse the right subtree, i.e., call Preorder(right-subtree)

Implementation:

C++

#include <iostream>

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

Uses of Preorder:
Preorder traversal is used to create a copy of the tree. Preorder traversal is also used to get prefix expression on of an expression tree. Please see http://en.wikipedia.org/wiki/Polish_notation to know why prefix expressions are useful.

3. Postorder Traversal (Practice):

Example: Postorder traversal for the above given Tree is 4 5 2 3 1.

Algorithm Postorder(tree)    1. Traverse the left subtree, i.e., call Postorder(left-subtree)    2. Traverse the right subtree, i.e., call Postorder(right-subtree)    3. Visit the root.

Implementation:

C++

#include <iostream>

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

Uses of Postorder:
Postorder traversal is used to delete the tree. Please see the question for deletion of tree for details. Postorder traversal is also useful to get the postfix expression of an expression tree. Please see http://en.wikipedia.org/wiki/Reverse_Polish_notation to for the usage of postfix expression.

Implementing all traversals using DFS

C++

#include <iostream>

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: If we don't consider size of stack for function calls then O(1) otherwise O(n).


thompsongionly.blogspot.com

Source: https://www.geeksforgeeks.org/dfs-traversal-of-a-tree-using-recursion/

0 Response to "Draw a Tree Recursion Java"

إرسال تعليق

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel