Program:
/*
Q1.WAP to create a simple binary tree and implement following functions.
-create() (using 0 as a terminating value)
-create() (using STOP as a terminating condition)
-show()
-3 recursive()
-3 nonrecursive
-search()
-count()
*/
#include<iostream>
#include<string>
#define MAX 100
using namespace std;
class Node
{
public:
int data;
Node* left;
Node* right;
Node()
{
data=0;
left=right=NULL;
}
Node(int x)
{
data = x;
left=right=NULL;
}
};
class Stack
{
Node* data[MAX];
int top;
public:
Stack()
{
top = -1;
}
int isFull()
{
if(top==MAX-1)
return 1;
return 0;
}
int isEmpty()
{
if(top==-1)
return 1;
return 0;
}
void push(Node*);
Node* pop();
};
void Stack::push(Node *p)
{
if(isFull())
{
cout<<"\n Stack is FULL!!";
return;
}
top++;
data[top] = p;
}
Node* Stack::pop()
{
if(isEmpty())
{
cout<<"\n Stack is Empty!!";
return NULL;
}
return data[top--];
}
/// Stack for PostOrder
class StackNode
{
public:
Node* address;
int flag;
};
class StackP
{
StackNode data[MAX];
int top;
public:
StackP()
{
top = -1;
}
int isFull()
{
if(top==MAX-1)
return 1;
return 0;
}
int isEmpty()
{
if(top==-1)
return 1;
return 0;
}
void push(StackNode);
StackNode pop();
};
void StackP::push(StackNode sn)
{
if(isFull())
{
cout<<"\n Stack is FULL!!";
return;
}
top++;
data[top] = sn;
}
StackNode StackP::pop()
{
if(isEmpty())
{
cout<<"\n Stack is Empty!!";
// Check
StackNode s;
return s;
}
return data[top--];
}
class Tree
{
Node* root;
public:
// Constructor
Tree()
{
root=NULL;
}
Node* getRoot()
{
return root;
}
Node* create_rec();
void create()
{
root = create_rec();
}
// Non-Recursive Call Def
void non_rec_preorder();
void non_rec_inorder();
void non_rec_postorder();
};
// Create 0
Node* Tree::create_rec()
{
int x;
cout<<"\nEnter Data:";
cin>>x;
if(x == 0)
return NULL;
Node *p;
p = new Node(x);
cout<<"\n Enter"<<x<<" of Left:";
p->left = create_rec();
cout<<"\n Enter "<<x<<" of Right:";
p->right = create_rec();
return p;
}
// Non-Recursive Tree Traversal
void Tree::non_rec_preorder()
{
Stack s;
Node* t;
t = root;
while(t != NULL || !s.isEmpty())
{
while(t != NULL)
{
cout<<t->data<<" ";
s.push(t);
t = t->left;
}
t = s.pop();
t = t->right;
}
}
void Tree::non_rec_inorder()
{
Stack s;
Node* t;
t = root;
while(t != NULL || !s.isEmpty() )
{
while(t!=NULL)
{
s.push(t);
t = t->left;
}
t = s.pop();
cout<<t->data<<" ";
t = t->right;
}
}
void Tree::non_rec_postorder()
{
StackNode sn;
StackP s;
Node* t;
t = root;
while(t!=NULL)
{
sn.address = t;
sn.flag = 0;
s.push(sn);
t = t->left;
}
while(!s.isEmpty())
{
sn = s.pop();
t = sn.address;
if(sn.flag == 1)
{
cout<<t->data<<" ";
}
else // flag = 0 left subtree visited
{
sn.flag = 1;
s.push(sn);
t = t->right;
while(t!=NULL)
{
sn.address=t;
sn.flag = 0;
s.push(sn);
t = t->left;
}
}
}
}
int main()
{
freopen("input.txt","r",stdin);
Tree t;
t.create();
cout<<"\n-------------------------------";
cout<<"\n\n Non-Recursive Traversal ";
cout<<"\n\n Preorder Traversal:";
t.non_rec_preorder();
cout<<"\n\n Inorder Traversal:";
t.non_rec_inorder();
cout<<"\n\n Postorder Traversal:";
t.non_rec_postorder();
return 0;
}
Input File:
10 5 3 0 0 7 0 0 15 13 0 0 17 0 0
Output:
