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:
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).
Source: https://www.geeksforgeeks.org/dfs-traversal-of-a-tree-using-recursion/
0 Response to "Draw a Tree Recursion Java"
إرسال تعليق