Program:
/*
WAP to create a TBT from given BST.
*/
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node* left,*right;
Node()
{
data = 0;
left=right = NULL;
}
Node(int x)
{
data = x;
left=right = NULL;
}
};
class BST
{
Node *root;
public:
BST()
{
root = NULL;
}
Node* getRoot()
{
return root;
}
void inorder(Node *t);
void create();
Node* insert_rec(Node *t,int x);
};
void BST::create()
{
int x;
while(1)
{
cout<<"\n\n Enter data: 0-Stop:";
cin>>x;
if(x == 0)
return;
root = insert_rec(root,x);
}
}
Node* BST::insert_rec(Node *t,int x)
{
if(t == NULL)
{
t = new Node(x);
return t;
}
if(x < t->data)
{
t->left = insert_rec(t->left,x);
return t;
}
else if (x > t->data)
{
t->right = insert_rec(t->right,x);
return t;
}
else
{
cout<<"\n\n Duplicated Data!";
return NULL;
}
}
void BST::inorder(Node *t)
{
if(t!=NULL)
{
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
}
}
class TBTNode
{
public:
TBTNode *left;
int lbit;
int data;
int child;
int rbit;
TBTNode *right;
TBTNode()
{
left = right = NULL;
lbit = rbit = 0;
child = -1;
data = 0;
}
TBTNode(int x)
{
left = right = NULL;
lbit = rbit = 0;
child = -1;
data = x;
}
};
class TBT
{
TBTNode *root;
public:
TBT()
{
// dummy node
root = new TBTNode();
root->left = root->right = root;
}
void copy(BST bt);
TBTNode* copy_rec(Node *t,int cld);
void convertIntoTBT(TBTNode *inorderArray[10]);
void createInorderArray(TBTNode *inorderArray[10],TBTNode* t);
void inorder();
TBTNode* findInorderSucc(TBTNode *t);
};
void TBT::inorder()
{
TBTNode *t = root->left;
while(t->lbit == 1)
{
t = t->left;
}
while( t != root)
{
cout<<t->data<<" ";
t = findInorderSucc(t);
}
}
TBTNode* TBT::findInorderSucc(TBTNode *t)
{
if(t->rbit == 0)
{
return t->right;
}
t = t->right;
while(t->lbit == 1)
{
t = t->left;
}
return t;
}
int ind = 0;
void TBT::copy(BST bt)
{
cout<<"\n copy rec start";
root->left = copy_rec(bt.getRoot(),0);
cout<<"\n Copy rec comp";
TBTNode *inorderArray[10];
createInorderArray(inorderArray,root->left);
cout<<"\n\n InorderArray:";
for(int i=0;i<ind;i++)
{
cout<<inorderArray[i]->data<<" ";
}
convertIntoTBT(inorderArray);
}
void TBT::convertIntoTBT(TBTNode *inorderArray[10])
{
TBTNode *t;
// changing first node
t = inorderArray[0];
t->left = root;
t->lbit = 0;
t->rbit = 1;
if(t->right == NULL)
{
t->right = inorderArray[1];
t->rbit = 0;
}
// changing last node
t = inorderArray[ind-1];
t->right = root;
t->rbit = 0;
t->lbit = 1;
if(t->left == NULL)
{
t->left = inorderArray[ind-2];
t->lbit = 0;
}
// changing middle ones
for(int i=1;i<=ind-2;i++)
{
t = inorderArray[i];
t->lbit = 1;
if(t->left == NULL)
{
t->left = inorderArray[i-1];
t->lbit = 0;
}
t->rbit = 1;
if(t->right == NULL)
{
t->right = inorderArray[i+1];
t->rbit = 0;
}
}
}
void TBT::createInorderArray(TBTNode *inorderArray[10],TBTNode* t)
{
if(t == NULL)
return;
createInorderArray(inorderArray,t->left);
inorderArray[ind++] = t;
createInorderArray(inorderArray,t->right);
}
TBTNode* TBT::copy_rec(Node *t,int cld)
{
if(t == NULL)
return NULL;
TBTNode *p = new TBTNode(t->data);
p->child = cld;
p->left = copy_rec(t->left,0);
p->right = copy_rec(t->right,1);
return p;
}
int main()
{
freopen("input.txt","r",stdin);
BST bt;
TBT tb;
bt.create();
cout<<"\n\n Inorder Traversal BST:";
bt.inorder(bt.getRoot());
tb.copy(bt);
cout<<"\n\n Inorder Traversal TBT:";
tb.inorder();
return 0;
}
Input File:
10 5 3 7 15 13 17 0
Output:
