📖 Scenario: Imagine you are building a simple phone contact search feature. When a user types the first few letters of a name, the app should quickly find all contacts starting with those letters.
🎯 Goal: You will build a small program in C that uses a Trie data structure to store contact names and then search for all contacts that start with a given prefix.
📋 What You'll Learn
Create a Trie node structure with children and end-of-word marker
Insert given contact names into the Trie
Search the Trie for all contacts starting with a given prefix
Print all matching contacts in alphabetical order
💡 Why This Matters
🌍 Real World
Tries are used in search engines, autocomplete features, and spell checkers to quickly find words starting with certain letters.
💼 Career
Understanding Tries helps in roles involving text processing, search optimization, and building efficient data retrieval systems.
Progress0 / 4 steps
1
Create Trie Node Structure
Define a struct called TrieNode with an array of 26 TrieNode* pointers named children and an integer isEndOfWord to mark the end of a word.
DSA C
Hint
Think of each node as a box with 26 slots for letters 'a' to 'z' and a flag to say if a word ends here.
2
Create a Function to Initialize a Trie Node
Write a function called getNode that returns a pointer to a new TrieNode with all children set to NULL and isEndOfWord set to 0.
DSA C
Hint
Use malloc to allocate memory and a loop to set all children to NULL.
3
Insert Words into the Trie
Write a function called insert that takes a TrieNode* called root and a char* called key. Insert the word key into the Trie by creating nodes as needed and marking the end of the word.
DSA C
Hint
Walk through each letter, create nodes if missing, then mark the last node as end of word.
4
Search and Print All Words with Given Prefix
Write a function called printWordsWithPrefix that takes a TrieNode* called root, a char* called prefix, and prints all words in the Trie that start with prefix. Then, in main, insert these words: "apple", "app", "apex", "bat", "bath". Finally, print all words starting with "ap".
DSA C
Hint
First find the node matching the prefix, then print all words below it recursively.
Practice
(1/5)
1. What is the main purpose of using a Trie data structure in prefix search?
easy
A. To perform arithmetic operations quickly
B. To sort words alphabetically
C. To store numbers in sorted order
D. To efficiently find all words that start with a given prefix
Solution
Step 1: Understand the role of Trie in prefix search
A Trie stores characters of words in a tree structure, allowing quick prefix lookups.
Step 2: Identify the main use case
It helps find all words starting with a prefix efficiently, unlike sorting or arithmetic.
Final Answer:
To efficiently find all words that start with a given prefix -> Option D
Quick Check:
Trie = Prefix search efficiency [OK]
Hint: Trie is built for prefix-based word retrieval [OK]
Common Mistakes:
Confusing Trie with sorting algorithms
Thinking Trie is for arithmetic
Assuming Trie stores numbers only
2. Which of the following is the correct way to declare a Trie node structure in C for prefix search?
easy
A. typedef struct TrieNode { int data; struct TrieNode* next; } TrieNode;
C. typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode;
D. typedef struct TrieNode { int value; struct TrieNode* left; struct TrieNode* right; } TrieNode;
Solution
Step 1: Identify Trie node components
A Trie node has an array of pointers for each alphabet letter and a flag for word end.
Step 2: Match with given options
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; matches this structure with 26 children pointers and an end-of-word flag.
Final Answer:
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; -> Option C
Quick Check:
Trie node = children array + end flag [OK]
Hint: Trie nodes have 26 children pointers for letters a-z [OK]
Common Mistakes:
Using linked list pointers instead of array for children
Confusing Trie node with linked list or binary tree node
Missing end-of-word flag
3. Given the following code snippet inserting words "cat", "car", and "dog" into a Trie, what will be the output of searching prefix "ca"?
Words "cat", "car", and "dog" are inserted, building branches for 'c' and 'd'.
Step 2: Search prefix "ca"
Both "cat" and "car" start with "ca", so they are returned by searchPrefix.
Final Answer:
["cat", "car"] -> Option A
Quick Check:
Prefix "ca" matches cat and car [OK]
Hint: Words starting with prefix are returned [OK]
Common Mistakes:
Returning only one matching word
Returning words not matching prefix
Empty result for existing prefix
4. Consider this buggy C code snippet for inserting a word into a Trie. What is the main error?
void insert(TrieNode* root, 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));
}
node = node->children[index];
}
node->isEndOfWord = 1;
}
medium
A. New nodes are not initialized after malloc
B. Index calculation is incorrect
C. Loop condition should be i < strlen(word)
D. isEndOfWord flag is set too early
Solution
Step 1: Analyze node creation
malloc allocates memory but does not initialize children pointers or isEndOfWord flag.
Step 2: Identify impact
Uninitialized children pointers can cause undefined behavior during traversal or insertion.
Final Answer:
New nodes are not initialized after malloc -> Option A
Quick Check:
malloc needs initialization [OK]
Hint: Always initialize new Trie nodes after malloc [OK]
Common Mistakes:
Assuming malloc zeroes memory
Ignoring initialization of isEndOfWord
Misunderstanding loop condition
5. You want to find all words in a Trie that start with prefix "app" and have length exactly 5. Which approach correctly combines prefix search and length filtering?
hard
A. Collect all words in Trie, then filter those starting with "app" and length 5
B. Traverse Trie to node for "app", then collect words of length 5 from there
C. Search for "app" as a full word, then check length 5
D. Use binary search on sorted word list for prefix "app" and length 5
Solution
Step 1: Use Trie prefix traversal
Traverse the Trie to the node representing the prefix "app" to limit search space.
Step 2: Collect words of length 5 from that node
From this node, recursively collect words that complete to length 5.
Final Answer:
Traverse Trie to node for "app", then collect words of length 5 from there -> Option B
Quick Check:
Prefix traversal + length filter = Traverse Trie to node for "app", then collect words of length 5 from there [OK]
Hint: Start at prefix node, then filter by length [OK]
Common Mistakes:
Filtering all words instead of prefix subtree
Searching prefix as full word
Using binary search on Trie data
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.