Program:
/*Q4.WAP to implement TBT with following functions.
-create() recursive
-delete() recursive */
#include <iostream>
using namespace std;
class TBTNode
{
public:
TBTNode *left;
int lbit;
int data;
int child;
int rbit;
TBTNode *right;
TBTNode()
{
lbit = rbit = 0;
data = 0;
child = -1;
left = right = NULL;
}
TBTNode(int x)
{
lbit = rbit = 0;
data = x;
child = -1;
left = right = NULL;
}
};
class TBT
{
TBTNode *root;
public:
TBT()
{
// dummmy node
root = new TBTNode();
root->left = root->right = root;
}
void create();
void create_rec(TBTNode *father, int cld);
void inorder();
TBTNode *inorder_suc(TBTNode *t);
void deleteData(int);
TBTNode *findLeaf(TBTNode *t);
void delete_rec(int x);
void deleteData(TBTNode *t);
TBTNode *findFather(TBTNode *t);
};
void TBT::create()
{
create_rec(root, 0);
}
void TBT::create_rec(TBTNode *father, int cld)
{
int x;
cout << "\n Enter Data: 0 to stop:";
cin >> x;
if (x == 0)
{
return;
}
TBTNode *t = new TBTNode(x);
// left child
if (cld == 0)
{
t->left = father->left;
t->child = 0;
t->right = father;
father->left = t;
father->lbit = 1;
}
else
{
t->right = father->right;
t->child = 1;
t->left = father;
father->right = t;
father->rbit = 1;
}
cout << "\n Enter left of " << x << ":";
create_rec(t, 0);
cout << "\n Enter right of " << x << ":";
create_rec(t, 1);
}
void TBT::inorder()
{
TBTNode *t = root->left;
while (t->lbit == 1)
{
t = t->left;
}
while (t != root)
{
cout << t->data << " ";
t = inorder_suc(t);
}
}
TBTNode *TBT::inorder_suc(TBTNode *t)
{
if (t->rbit == 0)
return t->right;
t = t->right;
while (t->lbit == 1)
t = t->left;
return t;
}
void TBT::delete_rec(int x)
{
TBTNode *t = root->left;
while (t->lbit == 1)
{
t = t->left;
}
// searching for the data
while (t != root)
{
if (t->data == x)
{
break;
}
t = inorder_suc(t);
}
if (t == root)
{
cout << "\n\n Data Not Found";
return;
}
cout << "\n\n Data found:" << t->data;
// data found
deleteData(t);
}
void TBT::deleteData(TBTNode *t)
{
TBTNode *father = findFather(t);
cout << "\n\n father:" << father->data;
// leaf node
if (t->lbit == 0 && t->rbit == 0)
{
if (t->child == 0)
{
father->left = t->left;
father->lbit = 0;
delete (t);
}
else
{
father->right = t->right;
father->rbit = 0;
delete (t);
}
return; // important statement
}
// not a leaf node
TBTNode *p = findLeaf(t);
cout << "\n\n p=" << p->data;
t->data = p->data;
deleteData(p);
}
TBTNode *TBT::findFather(TBTNode *t)
{
// left child
if (t->child == 0)
{
if (t->rbit == 0)
{
return t->right;
}
t = t->right;
while (t->rbit == 1)
{
t = t->right;
}
return t->right;
}
else
{
// right child
if (t->lbit == 0)
return t->left;
t = t->left;
while (t->lbit == 1)
t = t->left;
return t->left;
}
}
TBTNode *TBT::findLeaf(TBTNode *t)
{
while (t->lbit == 1 || t->rbit == 1)
{
if (t->lbit == 1)
{
t = t->left;
}
else
{
t = t->right;
}
}
return t;
}
int main()
{
freopen("input.txt", "r", stdin);
TBT t;
t.create();
cout << "\n\n Inorder Traversal:";
t.inorder();
int x;
cout << "\n Enter data to be deleted:";
cin >> x;
cout << "\nx:" << x;
t.delete_rec(x);
cout << "\n\n Inorder Traversal:";
t.inorder();
return 0;
}
Input File:
10 5 3 0 0 7 0 0 15 13 0 0 17 0 0 10
Output:

