📖 Scenario: Imagine you are building a simple phone directory app that stores contact names. To efficiently search names by their prefixes, you decide to use a Trie data structure.
🎯 Goal: Create a basic Trie node structure in Go that can hold children nodes for each letter and a flag to mark the end of a word.
📋 What You'll Learn
Define a struct called TrieNode with a map of children nodes
Include a boolean field isEndOfWord to mark complete words
Initialize a root node of type TrieNode
💡 Why This Matters
🌍 Real World
Tries are used in autocomplete features, spell checkers, and IP routing to quickly find words or prefixes.
💼 Career
Understanding Trie node design is important for software engineers working on search engines, text processing, and network software.
Progress0 / 4 steps
1
Define the TrieNode struct
Define a struct called TrieNode with two fields: children which is a map from rune to *TrieNode, and isEndOfWord which is a boolean.
DSA Go
Hint
Use type TrieNode struct {} to define the struct. The children map should use rune as key and pointer to TrieNode as value.
2
Create a function to initialize a new TrieNode
Write a function called NewTrieNode that returns a pointer to a TrieNode. Inside, initialize the children map as an empty map and set isEndOfWord to false.
DSA Go
Hint
Use make(map[rune]*TrieNode) to initialize the children map inside the function.
3
Initialize the root node of the Trie
Create a variable called root and assign it the result of calling NewTrieNode().
DSA Go
Hint
Use var root = NewTrieNode() to create the root node.
4
Print the initial state of the root node
Write a main function that prints the root variable.
DSA Go
Hint
Use println(root != nil) to confirm the root node is initialized.
Practice
(1/5)
1. What is the primary purpose of a Trie node in a Trie data structure?
easy
A. To store characters and links to child nodes for prefix-based search
B. To store integer values for sorting
C. To hold a single string value only
D. To act as a queue for BFS traversal
Solution
Step 1: Understand Trie node role
A Trie node stores characters and links to child nodes to represent prefixes of words.
Step 2: Compare options
Only To store characters and links to child nodes for prefix-based search correctly describes storing characters and child links for prefix search.
Final Answer:
To store characters and links to child nodes for prefix-based search -> Option A
Quick Check:
Trie node = prefix storage [OK]
Hint: Trie nodes hold characters and children for prefix search [OK]
Common Mistakes:
Thinking Trie nodes store whole words only
Confusing Trie nodes with array or queue structures
Assuming Trie nodes store integer values
2. Which of the following is the correct way to declare a Trie node struct in Go with children for 26 lowercase letters and a boolean to mark end of word?
easy
A. type TrieNode struct { children [26]*TrieNode; isEnd bool }
B. type TrieNode struct { children []*TrieNode; isEnd int }
C. type TrieNode struct { children map[int]TrieNode; isEnd bool }
D. type TrieNode struct { children [26]TrieNode; isEnd string }
Solution
Step 1: Check children type
Children should be an array of pointers to TrieNode for 26 letters: [26]*TrieNode.
Step 2: Check isEnd type
isEnd should be boolean to mark word end.
Final Answer:
type TrieNode struct { children [26]*TrieNode; isEnd bool } -> Option A
Quick Check:
Children as pointer array + bool isEnd = type TrieNode struct { children [26]*TrieNode; isEnd bool } [OK]
Hint: Use array of pointers and bool for end marker [OK]
Common Mistakes:
Using slice instead of fixed array for children
Using int or string instead of bool for isEnd
Using map with wrong key type
3. What will be the output of the following Go code snippet?
type TrieNode struct {
children [26]*TrieNode
isEnd bool
}
func main() {
root := &TrieNode{}
if root.children[0] == nil {
println("No child at index 0")
} else {
println("Child exists at index 0")
}
}
medium
A. Compilation error
B. No child at index 0
C. Child exists at index 0
D. Runtime panic
Solution
Step 1: Understand initialization of children array
When root is created, children array elements are nil pointers by default.
Step 2: Check condition in if statement
root.children[0] is nil, so condition is true and prints "No child at index 0".
Final Answer:
No child at index 0 -> Option B
Quick Check:
Uninitialized children = nil pointers [OK]
Hint: Uninitialized pointer arrays have nil elements [OK]
Common Mistakes:
Assuming children are auto-initialized with nodes
Expecting compilation or runtime errors
Confusing zero values for pointers
4. Identify the error in this Go code snippet for initializing a Trie node:
B. Children array is not initialized with pointers
C. Function returns a pointer to a local variable
D. Syntax error in struct declaration
Solution
Step 1: Analyze the NewNode function
The function creates a local struct variable node and returns its address &node.
Step 2: Identify the problem
Returning the pointer to a local variable risks a dangling pointer after the function exits, even though Go's escape analysis heap-allocates it; it's poor practice and should use &TrieNode{} instead.
Final Answer:
Function returns a pointer to a local variable -> Option C
Quick Check:
Return &local_var = bad practice [OK]
Hint: Avoid returning pointers to local variables [OK]
Common Mistakes:
Thinking children must be explicitly initialized
Confusing pointer nil with error
Assuming isEnd default must be true
5. You want to initialize a Trie node in Go that supports Unicode characters instead of just 26 lowercase letters. Which data structure change is best to support this efficiently?
hard
A. Keep children as [26]*TrieNode but convert Unicode to lowercase ASCII
B. Increase children array size to 65536 elements
C. Use slice []*TrieNode with fixed size 26
D. Change children from [26]*TrieNode array to map[rune]*TrieNode
Solution
Step 1: Understand Unicode support needs
Unicode has many characters beyond 26 letters, so fixed array is inefficient.
Step 2: Evaluate data structure options
Using map[rune]*TrieNode allows dynamic keys for any Unicode character efficiently.
Step 3: Reject other options
Array of 65536 is large and wasteful; slice with fixed size 26 is too small; converting Unicode to ASCII loses data.
Final Answer:
Change children from [26]*TrieNode array to map[rune]*TrieNode -> Option D
Quick Check:
Map with rune keys = Unicode support [OK]
Hint: Use map with rune keys for Unicode children [OK]
Common Mistakes:
Using large fixed arrays wasting memory
Ignoring Unicode complexity
Trying to fit Unicode into ASCII-only arrays
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.