📖 Scenario: Imagine you are building a simple word search tool that can quickly check if a word exists in a dictionary. To do this efficiently, you will use a Trie data structure, which stores words in a tree-like form.
🎯 Goal: You will create a Trie, add some words to it, and then write code to search for a specific word in the Trie.
📋 What You'll Learn
Create a Trie node structure using JavaScript objects
Insert given words into the Trie
Search for a given word in the Trie
Print true if the word exists, otherwise false
💡 Why This Matters
🌍 Real World
Tries are used in autocomplete systems, spell checkers, and word games to quickly find words or prefixes.
💼 Career
Understanding Tries helps in roles involving search optimization, text processing, and building efficient data retrieval systems.
Progress0 / 4 steps
1
Create the Trie root node
Create a variable called trie and set it to an empty object {} to represent the root node of the Trie.
DSA Javascript
Hint
The root node of a Trie is usually an empty object that will hold child nodes as keys.
2
Add a list of words to insert
Create a variable called words and set it to the array ["cat", "car", "dog"] which contains the words to add to the Trie.
DSA Javascript
Hint
Use an array to hold the words you want to add to the Trie.
3
Insert words into the Trie
Write a for loop using word to go through each word in words. Inside the loop, use a variable node set to trie. Then, use another for loop with char to go through each character in word. For each char, if node[char] does not exist, set it to an empty object {}. Then update node to node[char]. After the inner loop, set node.isWord = true to mark the end of the word.
DSA Javascript
Hint
Think of the Trie as a tree where each character is a branch. Create branches if they don't exist and mark the end of a word.
4
Search for a word in the Trie and print result
Create a variable called searchWord and set it to "car". Then create a variable called node and set it to trie. Use a for loop with char to go through each character in searchWord. Inside the loop, if node[char] does not exist, print false and return. Otherwise, update node to node[char]. After the loop, print node.isWord === true.
DSA Javascript
Hint
Follow the characters down the Trie. If any character is missing, the word is not found. If all characters are found and isWord is true, print true.
Practice
(1/5)
1. What is the main purpose of using a Trie data structure in word search?
easy
A. To efficiently store and search words by their prefixes
B. To sort words alphabetically
C. To store words in a hash table
D. To perform arithmetic operations on words
Solution
Step 1: Understand Trie structure
A Trie stores characters of words in a tree where each node represents a character.
Step 2: Identify Trie usage
It allows quick prefix-based search by traversing nodes matching characters.
Final Answer:
To efficiently store and search words by their prefixes -> Option A
Quick Check:
Trie = prefix search [OK]
Hint: Trie is all about prefix-based fast word search [OK]
Common Mistakes:
Confusing Trie with hash tables
Thinking Trie sorts words
Assuming Trie does arithmetic
2. Which of the following is the correct way to check if a word exists in a Trie in JavaScript?
easy
A. Use a loop to traverse nodes matching each character and check end flag
B. Use Array.includes(word) on the Trie object
C. Use JSON.stringify on Trie and search substring
D. Use Math.max on character codes of the word
Solution
Step 1: Understand Trie search method
Search involves traversing nodes for each character and checking if the word ends at last node.
Step 2: Eliminate incorrect options
Array.includes and JSON.stringify are not suitable for Trie structure. Math.max is unrelated.
Final Answer:
Use a loop to traverse nodes matching each character and check end flag -> Option A
Quick Check:
Traverse nodes + check end = correct search [OK]
Hint: Traverse each character node and check end flag [OK]
Common Mistakes:
Using array methods on Trie
Trying to convert Trie to string
Applying math functions on words
3. What will be the output of the following code snippet?
class TrieNode {
constructor() {
this.children = {};
this.isEnd = false;
}
}
class Trie {
constructor() {
this.root = new TrieNode();
}
insert(word) {
let node = this.root;
for (const char of word) {
if (!node.children[char]) node.children[char] = new TrieNode();
node = node.children[char];
}
node.isEnd = true;
}
search(word) {
let node = this.root;
for (const char of word) {
if (!node.children[char]) return false;
node = node.children[char];
}
return node.isEnd;
}
}
const trie = new Trie();
trie.insert('cat');
trie.insert('car');
console.log(trie.search('cat'));
console.log(trie.search('cap'));
medium
A. false false
B. false true
C. true false
D. true true
Solution
Step 1: Insert words 'cat' and 'car'
Both words are added character by character, marking end nodes for 't' and 'r'.
Step 2: Search 'cat' and 'cap'
'cat' exists with isEnd true, 'cap' path breaks at 'p' missing node, returns false.
Final Answer:
true false -> Option C
Quick Check:
Search 'cat' = true, 'cap' = false [OK]
Hint: Check inserted words and search path carefully [OK]
Common Mistakes:
Assuming 'cap' exists after inserting 'car'
Confusing isEnd flag
Ignoring missing child nodes
4. Identify the bug in the following Trie search method and select the fix:
search(word) {
let node = this.root;
for (const char of word) {
if (!node.children[char]) return false;
node = node.children[char];
}
return true;
}
medium
A. Return false at the end instead of true
B. Add a check for empty word before loop
C. Change for loop to while loop
D. Return node.isEnd instead of true to confirm full word match
Solution
Step 1: Analyze current search return
Returns true if path exists but does not check if word ends here.
Step 2: Correct return value
Must return node.isEnd to confirm the word is complete, not just prefix.
Final Answer:
Return node.isEnd instead of true to confirm full word match -> Option D
Quick Check:
Check isEnd flag to confirm word end [OK]
Hint: Always check isEnd flag to confirm full word [OK]
Common Mistakes:
Returning true without checking isEnd
Changing loop type unnecessarily
Ignoring empty word cases
5. Given a list of words, how can you use a Trie to find all words that start with a given prefix efficiently? Choose the best approach.
hard
A. Sort words and use binary search on prefix
B. Insert all words into Trie, traverse prefix nodes, then collect all descendant words
C. Use a hash map with prefix keys for direct lookup
D. Check each word in list if it starts with prefix using string methods
Solution
Step 1: Insert all words into Trie
Build Trie so each word is represented by a path of nodes.
Step 2: Traverse prefix nodes and collect words
Find node matching prefix end, then recursively collect all words below it.
Step 3: Compare other options
Sorting and binary search is possible but less efficient for many queries. Hash maps need many keys. Checking each word is slow.
Final Answer:
Insert all words into Trie, traverse prefix nodes, then collect all descendant words -> Option B