Program:
/*
Simple Binary Tree
-create()
-recursive inorder()
-nonrecursive preorder
-search data
-find leaf node of any Node
-find height of any Node
-Print height of all the nodes in a tree
-delete a node from tree.
*/
#include<iostream>
#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 isEmpty()
{
if(top == -1)
return 1;
return 0;
}
int isFull()
{
if(top == MAX -1)
return 1;
return 0;
}
void push(Node* t)
{
if(!isFull())
{
top++;
data[top] = t;
}
else
{
cout<<"\n Stack is Full";
}
}
Node* pop()
{
return data[top--];
}
};
class Tree
{
Node* root;
public:
Tree()
{
root = NULL;
}
Node* getRoot()
{
return root;
}
void create();
Node* create_rec();
void inorder(Node*);
int search(Node*,int x);
Node* leafNode(Node*);
int height(Node*);
void delete_(int);
Node* deleteNode(Node*,int,int&);
void preorder();
void heightAll(Node*);
};
void Tree::create()
{
root = create_rec();
}
Node* Tree::create_rec()
{
int x;
cout<<"\n Enter data, enter 0 to stop:";
cin>>x;
if(x == 0)
{
return NULL;
}
Node *p = new Node(x);
cout<<"\n Enter left of "<<x<<":";
p->left = create_rec();
cout<<"\n Enter right of "<<x<<":";
p->right = create_rec();
return p;
}
void Tree::inorder(Node* t)
{
if(t!=NULL)
{
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
}
}
int Tree::search(Node *t,int x)
{
if(t == NULL)
return 0;
if(t->data == x)
{
return 1;
}
int res;
res =search(t->left,x);
if(res == 0)
res = search(t->right,x);
return res;
}
Node* Tree::leafNode(Node *t)
{
if(t==NULL)
{
return NULL;
}
if(t->left == NULL && t->right == NULL)
{
return t;
}
if( t->left != NULL)
{
return leafNode(t->left);
}
else
{
return leafNode(t->right);
}
}
int Tree::height(Node* t)
{
int res1 = 0,res2 = 0;
if(t == NULL)
{
return 0;
}
if(t->left == NULL && t->right == NULL)
{
return 0;
}
if(t->left != NULL)
{
res1 = 1+height(t->left);
}
if(t->right != NULL)
{
res2 = 1+height(t->right);
}
return res1 > res2 ? res1 : res2;
}
void Tree::delete_(int x)
{
int res=0;
root = deleteNode(root,x,res);
if(res == 0)
{
cout<<"\n Data Not Found!";
}
}
Node* Tree::deleteNode(Node* t,int x,int &res)
{
if(t == NULL)
{
return NULL;
}
while(t->data != x)
{
t->left = deleteNode(t->left,x,res);
if(res == 0)
t->right = deleteNode(t->right,x,res);
return t;
}
// Data Found
if(t->left == NULL && t->right == NULL)
{
delete t;
res = 1;
cout<<"\n Data Delete Successfully";
return NULL;
}
if(t->left == NULL)
{
Node *p = t->right;
res = 1;
delete t;
return p;
}
if(t->right == NULL)
{
Node *p = t->left;
res = 1;
delete t;
return p;
}
Node *p = leafNode(t);
t->data = p->data;
t->left = deleteNode(t->left,p->data,res);
return t;
}
void Tree::heightAll(Node *t)
{
if(t != NULL)
{
heightAll(t->left);
cout<<"\n Element: "<<t->data;
cout<<" Height: "<<height(t)<<endl;
heightAll(t->right);
}
}
void Tree::preorder()
{
if(root == NULL)
return;
Node* t = root;
Stack s;
while(t != NULL)
{
cout<<t->data<<" ";
s.push(t);
t = t->left;
}
while( ! s.isEmpty() )
{
t = s.pop();
t = t->right;
while(t != NULL)
{
cout<<t->data<<" ";
s.push(t);
t = t->left;
}
}
}
int main()
{
freopen("input.txt","r",stdin);
Tree t;
int x;
t.create();
Node* p = t.getRoot();
cout<<"\n\n Inorder Display:";
t.inorder(p);
cout<<"\n\n Preorder Display:";
t.preorder();
cout<<"\n\n Height of tree:"<<t.height(p);
cout<<"\n\n Height of All Node:";
t.heightAll(p);
cout<<"\n\n Enter element to search:";
cin>>x;
if(t.search(p,x))
{
cout<<"\n Element found!";
}
else
{
cout<<"\n Element not Found!";
}
cout<<"\n\n Enter element to be deleted:";
cin>>x;
t.delete_(x);
cout<<"\n\n After Delete Inorder Display:";
t.inorder(p);
return 0;
}
Input File:
10 20 0 30 0 0 40 50 0 0 60 0 0 5 10
Output:
