draw an expression tree for the inorder traversal
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. Following are the generally used methods for traversing trees:
Example:
Inorder Traversal ( Practice ):
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.
Example: In order traversal for the above-given figure is 4 2 5 1 3.
C++
#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 <<
"\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)
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
"\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
;
}
}
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(
"\nInorder traversal "
+
"of binary tree is "
);
tree.printInorder();
}
}
Javascript
<script>
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);
document.write(node.key +
" "
);
}
function
printInorder(node) {
if
(node ==
null
)
return
;
printInorder(node.left);
document.write(node.key +
" "
);
printInorder(node.right);
}
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);
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>
Preorder Traversal ( Practice ):
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.
Example: Preorder traversal for the above-given figure is 1 2 4 5 3.
C++
#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 <<
"\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)
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)
C#
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);
}
void
printPreorder() { printPreorder(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(
"Preorder traversal "
+
"of binary tree is "
);
tree.printPreorder();
}
}
Javascript
<script>
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);
document.write(node.key +
" "
);
}
function
printInorder(node) {
if
(node ==
null
)
return
;
printInorder(node.left);
document.write(node.key +
" "
);
printInorder(node.right);
}
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);
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>
Postorder Traversal ( Practice ):
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
Example: Postorder traversal for the above-given figure is 4 5 2 3 1
Below is the implementation of the above traversal methods:
C++
#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 <<
"\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),
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
"\nPostorder traversal of binary tree is"
printPostorder(root)
C#
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 +
" "
);
}
void
printPostorder() { printPostorder(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(
"\nPostorder traversal "
+
"of binary tree is "
);
tree.printPostorder();
}
}
Javascript
<script>
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);
document.write(node.key +
" "
);
}
function
printInorder(node) {
if
(node ==
null
)
return
;
printInorder(node.left);
document.write(node.key +
" "
);
printInorder(node.right);
}
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);
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 the size of the stack for function calls then O(1) otherwise O(h) where h is the height of the tree.
Note: The height of the skewed tree is n (no. of elements) so the worst space complexity is O(N) and the height is (Log N) for the balanced tree so the best space
complexity is O(Log N).
Let us see different corner cases:
Complexity function T(n) — for all problems where tree traversal is involved — can be defined as: T(n) = T(k) + T(n – k – 1) + c
Where k is the number of nodes on one side of the root and n-k-1 on the other side.
Let's do an analysis of boundary conditions:
Case 1: Skewed tree (One of the subtrees is empty and another subtree is non-empty )
k is 0 in this case.
T(n) = T(0) + T(n-1) + c
T(n) = 2T(0) + T(n-2) + 2c
T(n) = 3T(0) + T(n-3) + 3c
T(n) = 4T(0) + T(n-4) + 4c
…………………………………………
………………………………………….
T(n) = (n-1)T(0) + T(1) + (n-1)c
T(n) = nT(0) + (n)c
Value of T(0) will be some constant say d. (traversing an empty tree will take some constants time)
T(n) = n(c+d)
T(n) = Θ(n) (Theta of n)Case 2: Both left and right subtrees have an equal number of nodes.
T(n) = 2T(|_n/2_|) + c
This recursive function is in the standard form (T(n) = aT(n/b) + (-)(n) ) for master method. If we solve it by master method we get (-)(n)
Source: https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/
0 Response to "draw an expression tree for the inorder traversal"
Post a Comment