diff --git a/trie.cpp b/trie.cpp new file mode 100644 index 0000000..37bf4f8 --- /dev/null +++ b/trie.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +using namespace std; + +class Trie { +private: + struct TrieNode { + unordered_map children; + bool isEndOfWord; + + TrieNode() : isEndOfWord(false) {} + }; + + TrieNode* root; + +public: + Trie() { + root = new TrieNode(); + } + + void insert(string word) { + TrieNode* current = root; + + for (char c : word) { + if (current->children.find(c) == current->children.end()) { + current->children[c] = new TrieNode(); + } + current = current->children[c]; + } + + current->isEndOfWord = true; + } + + bool search(string word) { + TrieNode* current = root; + + for (char c : word) { + if (current->children.find(c) == current->children.end()) { + return false; + } + current = current->children[c]; + } + + return current->isEndOfWord; + } + + bool startsWith(string prefix) { + TrieNode* current = root; + + for (char c : prefix) { + if (current->children.find(c) == current->children.end()) { + return false; + } + current = current->children[c]; + } + + return true; + } + + // Destructor to free memory + ~Trie() { + deleteTrie(root); + } + +private: + void deleteTrie(TrieNode* node) { + if (node == nullptr) return; + + for (auto& pair : node->children) { + deleteTrie(pair.second); + } + + delete node; + } +}; + +// Example usage and test cases +int main() { + Trie trie; + + // Test insert and search + trie.insert("apple"); + cout << "Search 'apple': " << (trie.search("apple") ? "true" : "false") << endl; + cout << "Search 'app': " << (trie.search("app") ? "true" : "false") << endl; + + // Test startsWith + cout << "StartsWith 'app': " << (trie.startsWith("app") ? "true" : "false") << endl; + + // Insert more words + trie.insert("app"); + trie.insert("application"); + trie.insert("apply"); + + // Test again + cout << "Search 'app': " << (trie.search("app") ? "true" : "false") << endl; + cout << "StartsWith 'appl': " << (trie.startsWith("appl") ? "true" : "false") << endl; + cout << "StartsWith 'xyz': " << (trie.startsWith("xyz") ? "true" : "false") << endl; + + return 0; +} \ No newline at end of file