Monday 2 January 2017

Dictionary using BST

/*
A Dictionary stores keywords & its meanings. Provide facility for adding new
keywords, deleting keywords, updating values of any entry. Provide facility to display whole data sorted in ascending/ Descending order. Also find how many maximum comparisons may require for finding any keyword. Use Binary Search Tree for implementation.
*/

#include<iostream>
using namespace std;

typedef struct node
{
struct node *pRt,*pLf;
string sWord,sMeaning;
}NODE;

class cQueue
{
 NODE *pQ[20];
 int iF,iR;
public:
 cQueue()
    {
  iF=iR=-1;
    }
 void fInsert(NODE*);
 NODE* fDelete();
 int fIsempty();

};

void cQueue::fInsert(NODE *pT)
{
 pQ[iR++]=pT;
}

NODE* cQueue::fDelete()
{
 return(pQ[iF++]);
}

int cQueue::fIsempty()
{
 if(iF==iR)
 return 1;
 return 0;
}

class cDictionary
{
public:
    NODE* fCreate();
    void fAdd(NODE*);
    void fDelete(NODE*,string);
    void fUpdate(NODE*);
    void fDisplay(NODE*,NODE*,int);
    void fDisplayIna(NODE*);
    void fDisplayPre(NODE*);
    void fDisplayPos(NODE*);
    void fDisplayLev(NODE*);

};

NODE* cDictionary::fCreate()
{
    NODE *pRoot,*pNn,*pCn,*pParent;
    char cCh;
    pRoot=NULL;
    do
    {
        pNn=new NODE;
        pNn->pLf=pNn->pRt=NULL;
        cout<<"Enter word: ";
        cin>>pNn->sWord;
        cout<<"Enter meaning: ";
        cin>>pNn->sMeaning;

        if(pRoot==NULL)
        pRoot=pNn;
        else
        {
            pCn=pRoot;
            while(pCn)
            {
                pParent=pCn;
                if(pCn->sWord<pNn->sWord)
                pCn=pCn->pRt;
                else
                pCn=pCn->pLf;

            }
            if(pParent->sWord<pNn->sWord)
            pParent->pRt=pNn;
            else
            pParent->pLf=pNn;

        }
        cout<<"do you want to continue(y/n) : ";
         cin>>cCh;

    }while(cCh=='y'||cCh=='Y');
return pRoot;
}

void cDictionary::fAdd(NODE *pRoot)
{
    NODE *pCn,*pNn,*pParent;
    pNn=new NODE;
    pNn->pLf=pNn->pRt=NULL;
    cout<<"Enter word: ";
    cin>>pNn->sWord;
    cout<<"enter Meaning";
    cin>>pNn->sMeaning;
    pCn=pRoot;
    while(pCn)
    {
        pParent=pCn;
        if(pCn->sWord<pNn->sWord)
            pCn=pCn->pRt;
        else
            pCn=pCn->pLf;
    }
    if(pParent->sWord<pNn->sWord)
    pParent->pRt=pNn;
    else
    pParent->pLf=pNn;
    cout<<"Word is added Succesfully to the Dictionary\n";


}


void cDictionary::fDelete(NODE *pPtr,string sData)
{
    NODE *pParent;
    while(pPtr)
    {
    if(pPtr->sWord==sData)
    break;
    pParent=pPtr;
    if(pPtr->sWord<sData)
    pPtr=pPtr->pRt;
    else
    pPtr=pPtr->pLf;

    }
        //case 1 leaf node
        if(pPtr->pLf==NULL&&pPtr->pRt==NULL)
        {
            if(pParent->pRt==pPtr)
            pParent->pRt=NULL;
            else
            pParent->pLf=NULL;
            delete(pPtr);
            cout<<"Node is deleted !\n";

        }

        //case 2 only 1 child
        else if(pPtr->pLf==NULL)
        {
            if(pParent->pRt==pPtr)
            pParent->pRt=pPtr->pRt;
            else
            pParent->pLf=pPtr->pRt;
            delete(pPtr);
            cout<<"Node is deleted !\n";

        }

        else if(pPtr->pRt==NULL)
        {
            if(pParent->pRt==pPtr)
            pParent->pRt=pPtr->pLf;
            else
            pParent->pLf=pPtr->pLf;
            delete(pPtr);
            cout<<"Node is deleted !\n";

        }

        //case 3 two childs
        else
        {
         pParent=pPtr;
         NODE *pTemp;
         pTemp=pPtr->pRt;
         while(pTemp->pLf)
         {
          pParent=pTemp;
          pTemp=pTemp->pLf;
         }
         pPtr->sWord=pTemp->sWord;
         pPtr->sMeaning=pTemp->sMeaning;
         if(pParent==pPtr)
         pPtr->pRt=pTemp->pRt;
         else
         pParent->pLf=NULL;
         delete(pTemp);
         cout<<"Node is deleted !\n";

        }

}


void cDictionary::fUpdate(NODE *pRoot)
{
    NODE *pCn;
    string sW;
    cout<<"Enter word to Update : ";
    cin>>sW;
    pCn=pRoot;
    while(pCn)
    {
        if(pCn->sWord==sW)
        {
            cout<<"Enter New Meaning : ";
            cin>>pCn->sMeaning;
            cout<<"Meaning Updated succesfully\n";
            return;

        }
        else
        {
        if(pCn->sWord<sW)
        pCn=pCn->pRt;
        else
        pCn=pCn->pLf;
        }

    }
cout<<"Word not found!\n";
}

void cDictionary::fDisplay(NODE *pRoot,NODE *pPtr, int level)

{
int i;
if(pPtr!=NULL)
{
fDisplay(pRoot,pPtr->pRt, level+1);
cout<<endl;
if (pPtr == pRoot)
cout<<"Root->:  ";
else
{
for (i = 0;i < level;i++)
cout<<"       ";
}
cout<<pPtr->sWord<<"->"<<pPtr->sMeaning;
fDisplay(pRoot,pPtr->pLf, level+1);
}
}


void cDictionary::fDisplayIna(NODE *pPtr)
{
    if(pPtr)
    {
        fDisplayIna(pPtr->pLf);
        cout<<pPtr->sWord<<"->"<<pPtr->sMeaning<<"\n";
        fDisplayIna(pPtr->pRt);

    }

}

void cDictionary::fDisplayPre(NODE *pPtr)
{
if(pPtr!=NULL)
{
 cout<<pPtr->sWord<<"->"<<pPtr->sMeaning<<" ";
 fDisplayPre(pPtr->pLf);
 fDisplayPos(pPtr->pRt);
}
}

void cDictionary::fDisplayPos(NODE *pPtr)
{
if(pPtr!=NULL)
{
     fDisplayPos(pPtr->pLf);
  fDisplayPos(pPtr->pRt);
  cout<<pPtr->sWord<<"->"<<pPtr->sMeaning<<" ";
}
}

void cDictionary::fDisplayLev(NODE *pPtr)
{
 cQueue oObj;
 NODE *pT;
 oObj.fInsert(pPtr);
 while(oObj.fIsempty()==0)
 {
  pT=oObj.fDelete();
  cout<<pT->sWord<<"->"<<pT->sMeaning<<"\n";
  if(pT->pLf)
  oObj.fInsert(pT->pLf);
  if(pT->pRt)
  oObj.fInsert(pT->pRt);
 }

}

int main()
{
    NODE *pRoot;
    string sW;
    cDictionary oObj;
    char cCh;
    int iCh;
    do
    {
     cout<<"\n\n";
        cout<<"1]Create dictionary\n";
        cout<<"2]Add new Word to the Dictionary\n";
        cout<<"3]Update Meaning of a Word\n";
        cout<<"4]Delete a word from Dictionary\n";
        cout<<"5]Display Dictionary Inorder\n";
        cout<<"6]Display Dictionary Preorder\n";
        cout<<"7]Display Dictionary Postorder\n";
        cout<<"8]Display Dictionary Levelorder\n";
        cout<<"9]Display Tree like structure\n";
        cout<<"\n\nEnter your Choice : ";
        cin>>iCh;
        switch(iCh)
        {
        case 1:
            pRoot=oObj.fCreate();
            break;

        case 2:
            oObj.fAdd(pRoot);
            break;

        case 3:
            oObj.fUpdate(pRoot);
            break;

        case 4:
            cout<<"enter word to delete : ";
            cin>>sW;
            oObj.fDelete(pRoot,sW);
            break;
        case 5:
            oObj.fDisplayIna(pRoot);
            break;

        case 6:
         oObj.fDisplayPre(pRoot);
            break;
        case 7:
            oObj.fDisplayPos(pRoot);
            break;
        case 8:
         oObj.fDisplayLev(pRoot);
      break;
        case 9:
          oObj.fDisplay(pRoot,pRoot,1);
            break;
        }
        cout<<"\npress 1 for main and 2 to exit ";
        cin>>cCh;
    }while(cCh=='1');

return 0;
}

1 comment:

  1. Tritanium's T-Tits T-Tits T-Tits T-Tits T-Tits - TI
    T. T. T. T. T. T. T. T. T. T. T. T. chi titanium flat irons T. T. T. T. T. T. T. T. T. T. T. T. T. T. sunscreen with zinc oxide and titanium dioxide T. T. T. T. T. ford edge titanium 2021 T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. titanium wedding bands for men T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. T. sunscreen with titanium dioxide T. T. T. T. T. T. T. T

    ReplyDelete