As part of my assignment , I am given an expression tree and I need to convert it to a in-fix with O(n) run-time. For example,
To convert this tree to "( ( 1 V ( 2 H ( 3 V 4 ) ) ) H ( 5 V 6 ) )". I couldn't think of a way to convert it straight to infix so I thought of first converting it to post-fix and than to in-fix. (If there's a better way please tell me).
Now, my problem is with converting the tree to post-order. I have tried the following:
private String treeToPost(Node node, String post) {
if (node != null) {
treeToPost(node.left, post);
treeToPost(node.right, post);
post = post + node.data.getName();
}
return post;
}
Now I have two problems with this method, the first one is that doesn't work because it only saves the last node it traveled, the second one is that I'm not sure it will run at O(n) because it will have to create a new string each time. I found a solution to this issue here but it used StringBuilder which I am not allowed to use. I thought of making an array of chars to save the data , but because I dont know the size of the tree I cant know the size of the needed array. Thank you for your time :)
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
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)
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.
#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
(
"Inorder traversal of binary tree is \n"
);
printInorder(root);
getchar
();
return
0;
}
#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
struct
Node *left, *right;
};
Node* newNode(
int
data)
{
Node* temp =
new
Node;
temp->data = data;
temp->left = temp->right = NULL;
return
temp;
}
void
printInorder(
struct
Node* node)
{
if
(node == NULL)
return
;
printInorder(node->left);
cout << 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);
cout <<
"Inorder traversal of binary tree is \n"
;
printInorder(root);
return
0;
}
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);
}
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(
"Inorder traversal of binary tree is "
);
tree.printInorder(tree.root);
}
}
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, end
=
" "
),
printInorder(root.right)
if
__name__
=
=
"__main__"
:
root
=
Node(
1
)
root.left
=
Node(
2
)
root.right
=
Node(
3
)
root.left.left
=
Node(
4
)
root.left.right
=
Node(
5
)
print
(
"Inorder traversal of binary tree is"
)
printInorder(root)
using
System;
class
Node {
public
int
key;
public
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);
Console.Write(node.key +
" "
);
printInorder(node.right);
}
void
printInorder() { printInorder(root); }
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);
Console.WriteLine(
"Inorder traversal "
+
"of binary tree is "
);
tree.printInorder();
}
}
class Node {
constructor(val) {
this
.key = val;
this
.left =
null
;
this
.right =
null
;
}
}
var
root =
null
;
function
printInorder(node) {
if
(node ==
null
)
return
;
printInorder(node.left);
console.log(node.key +
" "
);
printInorder(node.right);
}
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);
Output
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.
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)
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:
#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
(
"Preorder traversal of binary tree is \n"
);
printPreorder(root);
getchar
();
return
0;
}
#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
struct
Node *left, *right;
};
Node* newNode(
int
data)
{
Node* temp =
new
Node;
temp->data = data;
temp->left = temp->right = NULL;
return
temp;
}
void
printPreorder(
struct
Node* node)
{
if
(node == NULL)
return
;
cout << 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);
cout <<
"Preorder traversal of binary tree is \n"
;
printPreorder(root);
return
0;
}
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);
}
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(tree.root);
}
}
class
Node:
def
__init__(
self
, key):
self
.left
=
None
self
.right
=
None
self
.val
=
key
def
printPreorder(root):
if
root:
print
(root.val, end
=
" "
),
printPreorder(root.left)
printPreorder(root.right)
if
__name__
=
=
"__main__"
:
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)
using
System;
class
Node {
public
int
key;
public
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
;
Console.Write(node.key +
" "
);
printPreorder(node.left);
printPreorder(node.right);
}
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);
Console.WriteLine(
"Preorder traversal "
+
"of binary tree is "
);
tree.printPreorder(tree.root);
}
}
class Node {
constructor(val) {
this
.key = val;
this
.left =
null
;
this
.right =
null
;
}
}
var
root =
null
;
function
printPreorder(node) {
if
(node ==
null
)
return
;
document.write(node.key +
" "
);
printPreorder(node.left);
printPreorder(node.right);
}
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);
Output
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.
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
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:
#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
(
"Postorder traversal of binary tree is \n"
);
printPostorder(root);
getchar
();
return
0;
}
#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
struct
Node *left, *right;
};
Node* newNode(
int
data)
{
Node* temp =
new
Node;
temp->data = data;
temp->left = temp->right = NULL;
return
temp;
}
void
printPostorder(
struct
Node* node)
{
if
(node == NULL)
return
;
printPostorder(node->left);
printPostorder(node->right);
cout << 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);
cout <<
"Postorder traversal of binary tree is \n"
;
printPostorder(root);
return
0;
}
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 +
" "
);
}
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(
"Postorder traversal of binary tree is "
);
tree.printPostorder(tree.root);
}
}
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, end
=
" "
),
if
__name__
=
=
"__main__"
:
root
=
Node(
1
)
root.left
=
Node(
2
)
root.right
=
Node(
3
)
root.left.left
=
Node(
4
)
root.left.right
=
Node(
5
)
print
(
"Postorder traversal of binary tree is"
)
printPostorder(root)
using
System;
class
Node {
public
int
key;
public
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);
Console.Write(node.key +
" "
);
}
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);
Console.WriteLine(
"Postorder traversal "
+
"of binary tree is "
);
tree.printPostorder(tree.root);
}
}
class Node {
constructor(val) {
this
.key = val;
this
.left =
null
;
this
.right =
null
;
}
}
var
root =
null
;
function
printPostorder(node) {
if
(node ==
null
)
return
;
printPostorder(node.left);
printPostorder(node.right);
console.log(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);
console.log(
"Postorder traversal of binary tree is "
);
printPostorder(root);
Output
Postorder traversal of binary tree is 4 5 2 3 1
Some of the other tree traversals are:
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
The Boundary Traversal of a Tree includes:
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
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!