Autocomplete System with Trie in DSA C - Build from Scratch
TrieNode with an array children of size 26 for each letter and an isEndOfWord integer flag. Then create a function getNode() that returns a new TrieNode with all children set to NULL and isEndOfWord set to 0. Finally, create a function insert() that takes a TrieNode* root and a char* word and inserts the word into the Trie.Use an array of 26 pointers for children to represent each letter a-z. Initialize all children to NULL and isEndOfWord to 0 in getNode(). In insert(), loop over each character, calculate index by subtracting 'a', create new nodes if needed, and mark the last node's isEndOfWord as 1.
char* array called words with these exact words: "apple", "app", "application", "bat", "ball". Then create a TrieNode* variable called root and set it to the result of getNode().Define the array words with the exact words given. Then create root as a pointer to TrieNode and assign it the result of getNode().
for loop with variable i to insert each word from words into the Trie using insert(root, words[i]). Then implement a function TrieNode* searchNode(TrieNode* root, char* prefix) that returns the TrieNode where the prefix ends or NULL if prefix not found. Also implement a recursive function void suggestionsRec(TrieNode* root, char* prefix, char* buffer, int depth) that prints all words starting from the given node by appending characters to buffer. Finally, implement void printSuggestions(TrieNode* root, char* prefix) that uses searchNode and suggestionsRec to print all autocomplete suggestions for the prefix.Insert all words using a loop. searchNode walks down the Trie for the prefix. suggestionsRec recursively prints all words from a node by adding letters to a buffer. printSuggestions calls these to print all autocomplete words or a message if none found.
printSuggestions(root, "app") to print all autocomplete suggestions for the prefix "app".Call printSuggestions(root, "app") inside main() to print all words starting with "app".
Practice
Trie in an autocomplete system?Solution
Step 1: Understand the role of Trie in autocomplete
A Trie stores words character by character in a tree, allowing quick prefix matching.Step 2: Compare with other data structures
Linked lists and hash tables do not efficiently support prefix searches like Tries do.Final Answer:
To store words in a tree structure for fast prefix search -> Option AQuick Check:
Trie = fast prefix search [OK]
- Confusing Trie with hash table
- Thinking linked list is efficient for prefix search
- Assuming sorting alone solves autocomplete
Solution
Step 1: Identify the size of children array for lowercase letters
There are 26 lowercase English letters, so children array size should be 26.Step 2: Check the structure correctness
Each node has an array of pointers to children and a flag for end of word.Final Answer:
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; -> Option AQuick Check:
26 children for lowercase letters [OK]
- Using 52 for uppercase + lowercase without clarification
- Using 10 for digits only
- Not using array for children pointers
insert("apple");
insert("app");
insert("application");
searchPrefix("app");
What will searchPrefix("app") return?Solution
Step 1: Understand insertion of words
Words "apple", "app", and "application" are inserted, all sharing prefix "app".Step 2: Search prefix "app" returns all words starting with "app"
So, it returns all three words: "app", "apple", and "application".Final Answer:
["app", "apple", "application"] -> Option BQuick Check:
Prefix "app" matches 3 words [OK]
- Returning only exact matches
- Missing shorter word "app"
- Returning empty list incorrectly
void insert(TrieNode* root, const char* word) {
TrieNode* node = root;
for (int i = 0; word[i] != '\0'; i++) {
int index = word[i] - 'a';
if (node->children[index] == NULL) {
node->children[index] = malloc(sizeof(TrieNode));
memset(node->children[index], 0, sizeof(TrieNode));
}
node = node->children[index];
}
node->isEndOfWord = 1;
}
What is the main bug in this code?Solution
Step 1: Analyze malloc usage for new nodes
malloc allocates memory but does not initialize children pointers or isEndOfWord flag.Step 2: Consequence of missing initialization
Uninitialized children pointers may cause undefined behavior during traversal or insertion.Final Answer:
New nodes are not initialized after malloc -> Option DQuick Check:
malloc needs initialization [OK]
- Assuming malloc zeroes memory
- Thinking index calculation is wrong
- Ignoring initialization of isEndOfWord
Solution
Step 1: Consider memory and complexity
Using 52 children doubles memory; hash map adds overhead; ignoring case only during search is inefficient.Step 2: Normalize input for simplicity
Converting all words to lowercase before insertion and search simplifies Trie structure and ensures consistent matching.Final Answer:
Convert all input words to lowercase before insertion and search, keep children array size 26 -> Option CQuick Check:
Normalize case before Trie operations [OK]
- Doubling children array size unnecessarily
- Ignoring case only during search causes mismatch
- Using hash map adds complexity and overhead
Ready to prove it?
Pass the test and this pattern moves unknown
