📖 Scenario: Imagine you are building a simple search helper that stores words so you can quickly check if a word exists later. You will create a Trie, a tree-like structure where each node represents a letter. This helps in fast word lookup.
🎯 Goal: You will build the insert operation for a Trie. This means adding words letter by letter into the Trie structure.
📋 What You'll Learn
Create a TrieNode class with a children object and an isEndOfWord boolean
Create a Trie class with a root node
Add an insert method to the Trie class that adds a word letter by letter
Print the root node's children keys after inserting words to show the Trie structure
💡 Why This Matters
🌍 Real World
Tries are used in autocomplete features, spell checkers, and IP routing to quickly find words or prefixes.
💼 Career
Understanding Tries helps in roles involving search engines, text processing, and efficient data retrieval.
Progress0 / 4 steps
1
Create TrieNode and Trie classes
Create a class called TrieNode with a constructor that initializes children as an empty object and isEndOfWord as false. Then create a class called Trie with a constructor that initializes root as a new TrieNode.
DSA Javascript
Hint
Think of TrieNode as a box holding letters and a flag for word end. Trie starts with an empty root node.
2
Add insert method to Trie
Inside the Trie class, add a method called insert that takes a parameter word. Initialize a variable current to this.root.
DSA Javascript
Hint
Start the insert method by pointing to the root node. You will move through the Trie from here.
3
Complete insert method to add letters
In the insert method, use a for loop with variable char to go through each letter of word. For each char, if current.children[char] does not exist, set it to a new TrieNode(). Then update current to current.children[char]. After the loop, set current.isEndOfWord to true.
DSA Javascript
Hint
Check if the letter exists in children. If not, create a new node. Move current to that node. Mark the end of the word after the loop.
4
Insert words and print Trie root children keys
Create a new Trie instance called trie. Insert the words "cat", "car", and "dog" using the insert method. Then print Object.keys(trie.root.children) to show the first letters stored in the Trie.
DSA Javascript
Hint
Insert each word using insert. Then print the keys of trie.root.children to see the first letters stored.
Practice
(1/5)
1. What is the main purpose of the insert operation in a Trie data structure?
easy
A. To count the total words stored in the Trie
B. To delete a word from the Trie
C. To search for a word in the Trie
D. To add a new word character by character into the Trie
Solution
Step 1: Understand the insert operation
The insert operation adds each character of a word into the Trie one by one, creating nodes if they don't exist.
Step 2: Compare with other operations
Deleting removes words, searching finds words, and counting totals words, but insert specifically adds words.
Final Answer:
To add a new word character by character into the Trie -> Option D
Quick Check:
Insert = Add word step-by-step [OK]
Hint: Insert means adding word letters stepwise [OK]
Common Mistakes:
Confusing insert with search or delete
Thinking insert adds whole word as one node
Assuming insert counts words
2. Which of the following is the correct way to start inserting a word "cat" into an empty Trie in JavaScript?
easy
A. for (let char of word) { if (!node.children[char]) node.children[char] = new TrieNode(); node = node.children[char]; }
B. for (let i = 0; i < word.length; i++) { node = node.children[word[i]]; }
C. while (word) { node.children[word[0]] = new TrieNode(); word = word.slice(1); }
D. node.children[word] = new TrieNode();
Solution
Step 1: Analyze the loop for insertion
for (let char of word) { if (!node.children[char]) node.children[char] = new TrieNode(); node = node.children[char]; } loops over each character, checks if child node exists, creates if not, then moves to that child node.
Step 2: Check other options for correctness
for (let i = 0; i < word.length; i++) { node = node.children[word[i]]; } does not create nodes if missing. while (word) { node.children[word[0]] = new TrieNode(); word = word.slice(1); } modifies the word string but does not move node properly. node.children[word] = new TrieNode(); tries to add whole word as one child.
Final Answer:
for (let char of word) { if (!node.children[char]) node.children[char] = new TrieNode(); node = node.children[char]; } -> Option A
3. What will be the structure of the Trie after inserting the words ["bat", "ball"] in order? Consider each node stores children in an object and a boolean isEnd for word end.
medium
A. {"b":{"a":{"t":{"isEnd":false},"l":{"l":{"isEnd":true}}}}}
B. {"b":{"a":{"t":{"isEnd":true},"l":{"isEnd":true}}}}
C. {"b":{"a":{"t":{"isEnd":true},"l":{"l":{"isEnd":true}}}}}
D. {"b":{"a":{"t":{"isEnd":true}},"l":{"l":{"isEnd":true}}}}
Solution
Step 1: Insert "bat" into empty Trie
Creates nodes b -> a -> t with t's isEnd true.
Step 2: Insert "ball" next
Nodes b -> a exist, then add l -> l with last l's isEnd true.
Final Answer:
{"b":{"a":{"t":{"isEnd":true},"l":{"l":{"isEnd":true}}}}} -> Option C
Quick Check:
Both words share prefix 'ba', separate branches for 't' and 'll' [OK]
Hint: Shared prefix nodes, separate branches for different suffixes [OK]
Common Mistakes:
Marking wrong nodes as word end
Not creating second 'l' node for 'ball'
Overwriting nodes incorrectly
4. Given this insert function snippet, what is the bug?
insert(word) {
let node = this.root;
for (let char of word) {
if (!node.children[char]) {
node.children[char] = new TrieNode();
}
node = node.children;
}
node.isEnd = true;
}
medium
A. Missing check for empty word input
B. node is assigned to node.children instead of node.children[char]
C. isEnd should be set before the loop
D. Children should be an array, not an object
Solution
Step 1: Check node update inside loop
Inside loop, node is set to node.children (object), not node.children[char] (child node), so traversal breaks.
Step 2: Confirm correct pointer update
Correct is node = node.children[char] to move down the Trie properly.
Final Answer:
node is assigned to node.children instead of node.children[char] -> Option B
Quick Check:
Update node to child node, not children object [OK]
Hint: Update node to child node, not children object [OK]
Common Mistakes:
Assigning node to children object instead of child node
Setting isEnd too early
Ignoring empty input check
5. You want to insert the words ["apple", "app", "ape"] into a Trie and then check if the word "app" is a complete word in the Trie. Which approach correctly handles this scenario?
hard
A. Insert each word character by character, mark isEnd true at last character; then search for "app" checking isEnd at last node
B. Insert all words, but mark isEnd true only for the longest word; search ignores isEnd
C. Insert words as full strings in one node; search by matching full string keys
D. Insert words without marking isEnd; search by checking if path exists
Solution
Step 1: Insert words with isEnd marking
Each word is inserted letter by letter; isEnd is set true at last letter node to mark complete words.
Step 2: Search for "app" with isEnd check
Search traverses nodes for 'a'->'p'->'p' and checks isEnd true to confirm "app" is a complete word, not just prefix.
Final Answer:
Insert each word character by character, mark isEnd true at last character; then search for "app" checking isEnd at last node -> Option A
Quick Check:
Mark word ends, check isEnd to confirm full word [OK]
Hint: Mark word ends with isEnd, check isEnd when searching [OK]
Common Mistakes:
Not marking isEnd for shorter words
Treating prefixes as complete words without isEnd
Storing whole words as single nodes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.