dsa5
dsa5
AIM:
ii.Delete keyword
v. Search keyword & find how many maximum comparisons may require for finding any keyword.
Date: 22.04.2023
*/
#include<iostream>
#include<cstring>
char key[20];
char meaning[100];
}WORD;
{
struct node *LC;
WORD data;
}NODE;
class Stack
private:
int top;
NODE *data[30];
public:
Stack()
top=-1;
int isEmpty()
if(top == -1)
return 1;
else
return 0;
void push(NODE* p)
data[++top]=p;
NODE* pop()
return(data[top--]);
}
};
class BST
NODE *root;
int count;
public:
BST()
root=NULL;
count=0;
NODE* getroot()
return root;
if(T)
displayIN(T->LC);
cout<<T->data.key<<":"<<T->data.meaning<<endl;
displayIN(T->RC);
WORD words[100];
Stack s;
NODE *p;
p=root;
int i=0,n=0;
while(p!=NULL)
s.push(p);
p=p->LC;
while(!s.isEmpty())
p=s.pop();
strcpy(words[n].key,p->data.key);
strcpy(words[n].meaning,p->data.meaning);
n++;
p=p->RC;
while(p!=NULL)
s.push(p);
p=p->LC;
cout<<"\n";
for(i=n-1;i>=0;i--)
cout<<words[i].key<<":"<<words[i].meaning<<endl;
void addNode(WORD w)
NODE *p,*q,*cur;
p=new NODE;
p->data=w;
p->LC=p->RC=NULL;
if(root==NULL)
root=p;
else
cur=root;
while(cur)
q=cur;
if(strcmp(cur->data.key,w.key)==0)
cout<<"\nDuplicate Node!";
return ;
if(strcmp(cur->data.key,w.key)>0)
cur=cur->LC;
else
cur=cur->RC;
if(strcmp(q->data.key,w.key)>0)
q->LC=p;
else
q->RC=p;
return;
}
//ii. Delete Node
NODE *parent,*cur,*p,*q,*t;
bool found=false;
if(root==NULL)
cout<<"\nTree Empty!!";
else
cur=root;
while(cur)
//if key found then see its position before you delete
if(strcmp(cur->data.key,key) == 0)
found=true;
if(cur == root)
root=NULL;
delete cur;
else
delete cur;
else
if(cur->RC != NULL)
delete p;
p=t=cur->RC;
while(t)
t=t->LC;
cur->data=p->data;
q->LC=NULL;
delete p;
else
if(strcmp((parent->LC)->data.key,key)==0)//the leaf
node is left child of it's parent
cout<<"\nLeft Child!!";
parent->LC=NULL;
cout<<"\nRight Child!!";
parent->RC=NULL;
delete cur;
else
if(strcmp((parent->LC)->data.key,key)==0)
delete cur;
else
delete cur;
else
delete p;
p=t=cur->RC;
while(t)
t=t->LC;
cur->data=p->data;
q->LC=NULL;
delete p;
return;
if(strcmp(cur->data.key,key)>0)
parent=cur;//Remember Parent
cur=cur->LC;//Traverse to left
}
else
parent=cur;//Remember Parent
cur=cur->RC;;//Traverse to right
NODE *q,*cur;
char meaning[100];
if(root==NULL)
cout<<"\nTree Empty!!";
else
cur=root;
while(cur)
q=cur;
if(strcmp(cur->data.key,key) == 0)
cout<<cur->data.key<<" : "<<cur->data.meaning;
strcpy(cur->data.meaning,meaning);
return ;
if(strcmp(cur->data.key,key)>0)
cur=cur->LC;
else
cur=cur->RC;
return;
NODE *q,*cur;
if(root==NULL)
cout<<"\nTree Empty!!";
else
cur=root;
count=0;
while(cur)
count++;
q=cur;
if(strcmp(cur->data.key,key) == 0)
cout<<cur->data.key<<" : "<<cur->data.meaning;
return ;
if(strcmp(cur->data.key,key)>0)
cur=cur->LC;
else
cur=cur->RC;
return;
};
int main(void)
BST B;
int val,cho,n,cho1;
WORD w;
char key[30];
cho=0;
while(cho != 7)
cout<<"\n********DICTIONARY STORAGE*********";
cout<<"\n1-ADD WORD";
cout<<"\n2-DISPLAY WORD";
cout<<"\n7-EXIT";
cout<<"\nEnter ur choice:";
cin>>cho;
switch(cho)
case 1:
cout<<"\nEnter keyword:";
cin.clear();
fflush(stdin);
cin.getline(w.meaning,100);
B.addNode(w);
break;
case 2:
B.displayIN(B.getroot());
break;
case 3:
break;
case 4:
B.updateNode(key);
break;
case 5:
cin>>cho1;
if (cho1==1)
B.displayIN(B.getroot());
else
B.displayDesending(B.getroot());
break;
case 6:
B.searchNode(key);
break;
case 7:
cout<<"\nProgram Exits!!";
break;
default:
cout<<"\nWrong choice!";
}
return 0;