From c3a06c49f4528929d1dd1f4ffa4626c9855b0af6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 1 Oct 2025 18:57:12 +0000 Subject: [PATCH] feat: Implement Trie data structure Adds Trie and TrieNode classes for efficient string prefix operations. Co-authored-by: shivamkasoudhan --- trie | Bin 0 -> 44208 bytes trie.cpp | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 246 insertions(+) create mode 100755 trie create mode 100644 trie.cpp diff --git a/trie b/trie new file mode 100755 index 0000000000000000000000000000000000000000..3d281ad77a46fcc310d5385b08316af58b95b5cd GIT binary patch literal 44208 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 (l>Cr6SzsJ_Yog?b$v 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 +#include +#include +using namespace std; + +/** + * Trie (Prefix Tree) Implementation + * + * A Trie is a tree-like data structure that stores strings in a way that + * allows for efficient prefix-based operations. Each node represents a character, + * and paths from root to leaf nodes represent complete words. + * + * Key Components: + * 1. TrieNode: Represents each node in the trie + * 2. Trie: Main class containing the trie operations + * + * Time Complexities: + * - Insert: O(m) where m is the length of the word + * - Search: O(m) where m is the length of the word + * - startsWith: O(m) where m is the length of the prefix + * + * Space Complexity: O(ALPHABET_SIZE * N * M) where N is number of words and M is average length + */ + +class TrieNode { +public: + TrieNode* children[26]; // Array to store child nodes for each letter (a-z) + bool isEndOfWord; // Flag to mark if this node represents end of a word + + // Constructor + TrieNode() { + isEndOfWord = false; + for (int i = 0; i < 26; i++) { + children[i] = nullptr; + } + } + + // Destructor to prevent memory leaks + ~TrieNode() { + for (int i = 0; i < 26; i++) { + if (children[i] != nullptr) { + delete children[i]; + } + } + } +}; + +class Trie { +private: + TrieNode* root; + + // Helper function to convert character to index (0-25) + int charToIndex(char c) { + return c - 'a'; + } + +public: + // Constructor + Trie() { + root = new TrieNode(); + } + + // Destructor + ~Trie() { + delete root; + } + + /** + * Insert a word into the trie + * + * Algorithm: + * 1. Start from the root node + * 2. For each character in the word: + * - Calculate the index for the character + * - If the child node doesn't exist, create it + * - Move to the child node + * 3. Mark the last node as end of word + * + * Time Complexity: O(m) where m is the length of the word + * Space Complexity: O(m) for the path nodes + */ + void insert(string word) { + TrieNode* current = root; + + for (char c : word) { + int index = charToIndex(c); + + // If child node doesn't exist, create it + if (current->children[index] == nullptr) { + current->children[index] = new TrieNode(); + } + + // Move to the child node + current = current->children[index]; + } + + // Mark the last node as end of word + current->isEndOfWord = true; + } + + /** + * Search for a complete word in the trie + * + * Algorithm: + * 1. Start from the root node + * 2. For each character in the word: + * - Calculate the index for the character + * - If the child node doesn't exist, return false + * - Move to the child node + * 3. Check if the last node is marked as end of word + * + * Time Complexity: O(m) where m is the length of the word + * Space Complexity: O(1) + */ + bool search(string word) { + TrieNode* current = root; + + for (char c : word) { + int index = charToIndex(c); + + // If child node doesn't exist, word is not in trie + if (current->children[index] == nullptr) { + return false; + } + + // Move to the child node + current = current->children[index]; + } + + // Return true only if this node is marked as end of word + return current->isEndOfWord; + } + + /** + * Check if any word in the trie starts with the given prefix + * + * Algorithm: + * 1. Start from the root node + * 2. For each character in the prefix: + * - Calculate the index for the character + * - If the child node doesn't exist, return false + * - Move to the child node + * 3. If we can traverse the entire prefix, return true + * + * Time Complexity: O(m) where m is the length of the prefix + * Space Complexity: O(1) + */ + bool startsWith(string prefix) { + TrieNode* current = root; + + for (char c : prefix) { + int index = charToIndex(c); + + // If child node doesn't exist, no word starts with this prefix + if (current->children[index] == nullptr) { + return false; + } + + // Move to the child node + current = current->children[index]; + } + + // If we can traverse the entire prefix, return true + return true; + } + + /** + * Utility function to print all words in the trie + * This is helpful for debugging and understanding the trie structure + */ + void printAllWords() { + cout << "All words in the trie: "; + printWordsFromNode(root, ""); + cout << endl; + } + +private: + void printWordsFromNode(TrieNode* node, string currentWord) { + if (node == nullptr) return; + + // If this node marks the end of a word, print it + if (node->isEndOfWord) { + cout << currentWord << " "; + } + + // Recursively traverse all children + for (int i = 0; i < 26; i++) { + if (node->children[i] != nullptr) { + char c = 'a' + i; + printWordsFromNode(node->children[i], currentWord + c); + } + } + } +}; + +// Test driver program +int main() { + cout << "=== Trie (Prefix Tree) Implementation Demo ===" << endl << endl; + + Trie trie; + + // Test insert operation + cout << "1. Inserting words into the trie..." << endl; + vector words = {"apple", "app", "application", "apply", "banana", "band", "bandana"}; + + for (const string& word : words) { + trie.insert(word); + cout << " Inserted: " << word << endl; + } + cout << endl; + + // Test search operation + cout << "2. Testing search operation..." << endl; + vector searchWords = {"app", "apple", "application", "banana", "band", "ban", "xyz"}; + + for (const string& word : searchWords) { + bool found = trie.search(word); + cout << " Search '" << word << "': " << (found ? "Found" : "Not found") << endl; + } + cout << endl; + + // Test startsWith operation + cout << "3. Testing startsWith operation..." << endl; + vector prefixes = {"app", "ban", "band", "xyz", "a", "b"}; + + for (const string& prefix : prefixes) { + bool hasPrefix = trie.startsWith(prefix); + cout << " startsWith '" << prefix << "': " << (hasPrefix ? "Yes" : "No") << endl; + } + cout << endl; + + // Print all words in the trie + cout << "4. All words currently in the trie:" << endl; + trie.printAllWords(); + cout << endl; + + // Demonstrate the trie structure concept + cout << "=== Trie Structure Explanation ===" << endl; + cout << "The trie stores words as follows:" << endl; + cout << "- Each node represents a character" << endl; + cout << "- Paths from root to marked nodes represent complete words" << endl; + cout << "- Common prefixes share the same path" << endl; + cout << "- Example: 'app', 'apple', 'application' all share the 'app' prefix" << endl; + + return 0; +} \ No newline at end of file