📖 Scenario: Imagine you are building a simple phone contact search feature. You want to quickly check if a contact name exists in your phonebook using a Trie data structure.
🎯 Goal: You will create a Trie, insert some contact names, and then write a search function to check if a given contact name exists.
📋 What You'll Learn
Create a TrieNode struct with children map and endOfWord boolean
Create a Trie struct with root node
Insert given contact names into the Trie
Implement a search function to find if a contact name exists
Print the search result as true or false
💡 Why This Matters
🌍 Real World
Tries are used in autocomplete features, spell checkers, and contact search in phones.
💼 Career
Understanding Tries helps in building efficient search and retrieval systems, a common task in software engineering.
Progress0 / 4 steps
1
Create TrieNode and Trie structs
Create a struct called TrieNode with a field children of type map[rune]*TrieNode and a boolean field endOfWord. Also create a struct called Trie with a field root of type *TrieNode. Initialize the root in a function called NewTrie.
DSA Go
Hint
Think of children as branches for each letter and endOfWord to mark complete words.
2
Insert contact names into the Trie
Add a method Insert to the Trie struct that takes a string word. For each character in word, traverse or create child nodes in children. Mark the last node's endOfWord as true. Insert these exact contact names: "alice", "bob", "carol".
DSA Go
Hint
Use a loop to go through each letter and create nodes if missing.
3
Implement search function in Trie
Add a method Search to the Trie struct that takes a string word and returns a boolean. Traverse the Trie nodes for each character in word. If any character is missing, return false. After the loop, return the endOfWord value of the last node.
DSA Go
Hint
Check each letter node exists, return false if missing, else return if last node marks end of word.
4
Print search results for given names
In the main function, use the Search method to check if "alice", "bob", "carol", and "dave" exist in the Trie. Print the results as true or false on separate lines in this order.
DSA Go
Hint
Use println to print the boolean results of each search.
Practice
(1/5)
1. What does the search operation in a Trie data structure check for?
easy
A. The number of words stored in the Trie
B. If the Trie is empty
C. If a given word exists in the Trie
D. The length of the longest word in the Trie
Solution
Step 1: Understand the purpose of Trie search
The search operation in a Trie is designed to check if a specific word is stored in the Trie.
Step 2: Differentiate from other Trie operations
Other operations like counting words or checking emptiness are not the purpose of search.
Final Answer:
If a given word exists in the Trie -> Option C
Quick Check:
Trie search checks word existence [OK]
Hint: Search checks if the exact word is stored [OK]
Common Mistakes:
Confusing search with counting words
Thinking search checks Trie emptiness
Assuming search returns word length
2. Which of the following is the correct way to check if a character node exists in a Trie map in Go?
easy
A. if node.children[char] != nil
B. if node.children[char] == nil
C. if node.children.contains(char)
D. if node.children.has(char)
Solution
Step 1: Recall Go map access syntax
In Go, to check if a key exists in a map, you check if the value is not nil (for pointer or map values).
Step 2: Apply to Trie children map
Trie children are stored in a map from rune to *TrieNode, so checking if node.children[char] != nil confirms existence.
Final Answer:
if node.children[char] != nil -> Option A
Quick Check:
Go map key exists check [OK]
Hint: Check map key by comparing to nil in Go [OK]
Common Mistakes:
Using contains or has methods (not in Go maps)
Checking for equality to nil incorrectly
Confusing map key existence with value presence
3. Consider the following Go code snippet for searching a word in a Trie:
func (t *Trie) Search(word string) bool {
node := t.root
for _, ch := range word {
if node.children[ch] == nil {
return false
}
node = node.children[ch]
}
return node.isEnd
}
What will be the output of Search("cat") if the Trie contains the words "car", "cat", and "cap"?
medium
A. compilation error
B. true
C. runtime error
D. false
Solution
Step 1: Trace the search for "cat" in the Trie
The loop checks each character 'c', 'a', 't' in order. Since "cat" is inserted, all nodes exist and node.isEnd is true at 't'.
Step 2: Return value after traversal
Because node.isEnd is true at the last character, the function returns true.
Final Answer:
true -> Option B
Quick Check:
Word "cat" exists in Trie = true [OK]
Hint: Search returns true if last node marks word end [OK]
Common Mistakes:
Ignoring isEnd flag and returning true always
Assuming false if any child exists
Confusing runtime errors with nil checks
4. The following Go code for Trie search has a bug. What is the error?
func (t *Trie) Search(word string) bool {
node := t.root
for i := 0; i <= len(word); i++ {
ch := rune(word[i])
if node.children[ch] == nil {
return false
}
node = node.children[ch]
}
return node.isEnd
}
medium
A. Missing check for empty Trie root
B. Incorrect rune conversion for characters
C. Returning wrong boolean value
D. Index out of range error due to loop condition
Solution
Step 1: Analyze the loop condition
The loop runs from i = 0 to i <= len(word), which means it tries to access word[len(word)] causing index out of range error.
Step 2: Correct loop boundary
The loop should run with i < len(word) to avoid accessing beyond the string length.
Final Answer:
Index out of range error due to loop condition -> Option D
Quick Check:
Loop boundary error causes runtime panic [OK]
Hint: Use i < len(word), not i <= len(word) in loops [OK]
Common Mistakes:
Using <= instead of < in loop
Ignoring string length limits
Assuming rune conversion causes error
5. You want to modify the Trie search function to support prefix search (check if any word starts with the given prefix). Which change is correct?
hard
A. Return true immediately after traversing all prefix characters without checking isEnd
B. Return true only if isEnd is true at last prefix character
C. Return false if any character node is missing, else return false always
D. Return true only if prefix length equals word length stored
Solution
Step 1: Understand prefix search goal
Prefix search should return true if the prefix exists as a path in the Trie, regardless of isEnd flag.
Step 2: Modify search to return true after prefix traversal
After checking all prefix characters exist, return true immediately without checking isEnd.
Final Answer:
Return true immediately after traversing all prefix characters without checking isEnd -> Option A
Quick Check:
Prefix search ignores isEnd, returns true if path exists [OK]
Hint: For prefix, return true after full prefix traversal [OK]
Common Mistakes:
Checking isEnd for prefix search
Returning false even if prefix path exists
Confusing prefix length with word length
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.