Untitled
unknown
plain_text
4 years ago
8.6 kB
10
Indexable
// A Dictionary stores keywords and 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;
int count{0};
bool correct(string a)
{
bool op = true;
for (int i = 0; i < a.length(); i++)
{
char ch = a[i];
if (ch >= 97 && ch <= 122)
{
continue;
}
else if (ch == 32 || ch == 44 || ch == 39 || ch == 46) // 32 is space 44 is comma 39 is apostrophe 46 fullstop.
{
continue;
}
else
{
op = false;
}
}
return op;
};
struct Node
{
string keyword, meaning;
Node *left, *right;
};
Node *newNode(string keyword, string meaning)
{
Node *newNode = new Node;
newNode->keyword = keyword;
newNode->meaning = meaning;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
};
Node *insert(Node *root, string keyword, string meaning)
{
if (root == NULL)
{
root = newNode(keyword, meaning);
}
else if (keyword <= root->keyword)
{
root->left = insert(root->left, keyword, meaning);
}
else
{
root->right = insert(root->right, keyword, meaning);
}
return root;
};
Node *create(Node *root)
{
string keyword, meaning;
bool x, y = true;
while (x)
{
try
{
cout << "Enter keyword : ";
getline(cin >> ws, keyword);
if (correct(keyword) == false)
{
throw 1;
}
else
{
x = false;
}
}
catch (...)
{
cout << "Enter valid string" << endl;
}
}
while (y)
{
try
{
cout << "Enter meaning : ";
getline(cin >> ws, meaning);
if (correct(meaning) == false)
{
throw 1;
}
else
{
y = false;
}
}
catch (...)
{
cout << "Enter valid string" << endl;
}
}
root = insert(root, keyword, meaning);
return root;
};
void inorder(Node *root)
{
if (root != NULL)
{
inorder(root->left);
cout << root->keyword << " : " << root->meaning << endl;
inorder(root->right);
}
}
void reverseorder(Node *root)
{
if (root != NULL)
{
reverseorder(root->right);
cout << root->keyword << " : " << root->meaning << endl;
reverseorder(root->left);
}
}
Node *searc(Node *root, string keyword)
{
count += 1;
if (root == NULL || root->keyword == keyword)
{
return root;
}
if (root->keyword < keyword)
{
return searc(root->right, keyword);
}
else
{
return searc(root->left, keyword);
}
};
Node *s(Node *root)
{
string search;
bool x = true;
while (x)
{
try
{
cout << "Enter Search element : ";
cin >> search;
if (correct(search))
{
x = false;
}
else
{
throw 1;
}
}
catch (...)
{
cout << "Enter valid string" << endl;
}
}
Node *a;
a = searc(root, search);
return a;
}
void update(Node *root, string keyword, string up_meaning)
{
Node *a;
a = searc(root, keyword);
if (a)
{
a->meaning = up_meaning;
}
else
{
cout << "Word Not Found" << endl;
}
}
Node *Minvalue(Node *root)
{
while (root->left != NULL)
{
root = root->left;
}
return root;
};
Node *deleteNode(Node *root, string key)
{
if (root == NULL)
return root;
else if (key < root->keyword)
root->left = deleteNode(root->left, key);
else if (key > root->keyword)
root->right = deleteNode(root->right, key);
else
{
if (root->left == NULL && root->right == NULL)
{
delete (root);
root = NULL;
}
else if (root->left == NULL)
{
Node *temp = root;
root = root->right;
delete temp;
}
else if (root->right == NULL)
{
Node *temp = root;
root = root->left;
delete temp;
}
else
{
Node *temp = Minvalue(root->right);
root->keyword = temp->keyword;
root->meaning = temp->meaning;
root->right = deleteNode(root->right, temp->keyword);
}
}
return root;
}
int main()
{
Node *root = NULL;
Node *a,*c;
int ch;
string up_keyword;
string keyword;
do
{
cout << "MENU" << endl;
cout << "1. Insert" << endl;
cout << "2. Print in ascending order" << endl;
cout << "3. Print in descending order" << endl;
cout << "4. Search" << endl;
cout << "-1. Exit" << endl;
cout << "Enter operation to be performed : ";
cin >> ch;
switch (ch)
{
case 1:
root = create(root);
break;
case 2:
if (root == NULL)
{
cout << "**********************" << endl;
cout << "Tree is empty" << endl;
cout << "**********************" << endl;
}
else
{
cout << "**********************" << endl;
inorder(root);
cout << "**********************" << endl;
}
break;
case 3:
if (root == NULL)
{
cout << "**********************" << endl;
cout << "Tree is empty" << endl;
cout << "**********************" << endl;
}
else
{
cout << "**********************" << endl;
reverseorder(root);
cout << "**********************" << endl;
}
break;
case 4:
if (root == NULL)
{
cout << "**********************" << endl;
cout << "Tree is empty" << endl;
cout << "**********************" << endl;
}
else
{
a = s(root);
if (a)
{
cout << "**********************" << endl;
cout << "Found " << endl;
cout << a->keyword << " : " << a->meaning << endl;
cout << "Number of comparisons" << count << endl;
count = 0;
cout << "**********************" << endl;
}
else
{
cout << "**********************" << endl;
cout << "Not found " << endl;
cout << "Number of comparisons" << count << endl;
count = 0;
cout << "**********************" << endl;
}
}
break;
case 5:
cout << "Original string : ";
cin >> keyword;
cout << endl;
c=searc(root, keyword);
if(c)
{
cout << "New meaning : ";
cin >> up_keyword;
update(root, keyword, up_keyword);
}
else
{
cout<<"No word present"<<endl;
}
break;
case 6:
string key;
cout << "Enter string : ";
cin >> key;
Node *b=searc(root,key);
if(b)
root = deleteNode(root, key);
else
{
cout<<"Element not present in tree"<<endl;
}
break;
}
} while (ch != -1);
cout << "Thank You";
return 0;
}Editor is loading...