From 647aa2d29054b8f5697776057335a12ba4083735 Mon Sep 17 00:00:00 2001 From: bag-PacKer <35328339+bag-PacKer@users.noreply.github.com> Date: Mon, 8 Oct 2018 12:33:51 +0530 Subject: [PATCH] Create Trie.cpp Using Trie data structure we can store large dictionary and search spelling fast. --- data-structures/Trie.cpp | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 data-structures/Trie.cpp diff --git a/data-structures/Trie.cpp b/data-structures/Trie.cpp new file mode 100644 index 00000000..89e243eb --- /dev/null +++ b/data-structures/Trie.cpp @@ -0,0 +1,79 @@ +#include +using namespace std; +const int SIZE = 26; + +struct MyNode{ + struct MyNode *children[SIZE]; + bool isEndOfWord; +}; + +// Returns new trie node +struct MyNode *getNode(void) +{ + struct MyNode *pNode = new MyNode; + + pNode->isEndOfWord = false; + + for (int i = 0; i < SIZE; i++) + pNode->children[i] = NULL; + + return pNode; +} + +/* If not present, inserts key into trie + If the key is prefix of trie node, just + marks leaf node*/ +void insert(struct MyNode *root, string key) +{ + struct MyNode *pCrawl = root; + + for (int i = 0; i < key.length(); i++) + { + int index = key[i] - 'a'; + if (!pCrawl->children[index]) + pCrawl->children[index] = getNode(); + + pCrawl = pCrawl->children[index]; + } + + // mark last node as leaf + pCrawl->isEndOfWord = true; +} + +// Returns true if key presents in trie, else false +bool search(struct MyNode *root, string key) +{ + struct MyNode *pCrawl = root; + + for (int i = 0; i < key.length(); i++) + { + int index = key[i] - 'a'; + if (!pCrawl->children[index]) + return false; + + pCrawl = pCrawl->children[index]; + } + + return (pCrawl != NULL && pCrawl->isEndOfWord); +} + +// Driver Programme to check above functions +int main() +{ + // For input keys use only lower case + string keys[] = {"the", "a", "there", + "answer", "any", "by", + "bye", "their" }; + int n = sizeof(keys)/sizeof(keys[0]); + + struct MyNode *root = getNode(); + + // Build trie + for (int i = 0; i < n; i++) + insert(root, keys[i]); + + // Search for different keys to check is it present in our dictonary or not..?? + search(root, "the")? cout << "Yes\n" : cout << "No\n"; + search(root, "these")? cout << "Yes\n" : cout << "No\n"; + return 0; +}