📖 Scenario: Imagine you are building a simple search feature for a phone contacts app. To do this efficiently, you want to create a special tree called a Trie that helps find names quickly by their letters.
🎯 Goal: You will create the basic building block of this Trie called a TrieNode. This node will hold letters and links to other nodes. You will set it up so it can be used to build the full Trie later.
📋 What You'll Learn
Create a class called TrieNode
Inside the class, create a constructor method
In the constructor, create a property called children that is an empty object
In the constructor, create a property called isEndOfWord and set it to false
💡 Why This Matters
🌍 Real World
Tries are used in search engines, autocomplete features, and spell checkers to quickly find words or prefixes.
💼 Career
Understanding trie node design helps in roles involving data structures, algorithms, and building efficient search or text processing systems.
Progress0 / 4 steps
1
Create the TrieNode class
Create a class called TrieNode with an empty constructor method constructor().
DSA Javascript
Hint
Use the class keyword to create a class named TrieNode. Inside it, write an empty constructor() method.
2
Add the children property
Inside the constructor() of TrieNode, create a property called children and set it to an empty object {}.
DSA Javascript
Hint
Use this.children = {} inside the constructor to create an empty object for child nodes.
3
Add the isEndOfWord property
Inside the constructor() of TrieNode, create a property called isEndOfWord and set it to false.
DSA Javascript
Hint
Use this.isEndOfWord = false inside the constructor to mark the node as not ending a word yet.
4
Create an instance and print its properties
Create a variable called node and set it to a new instance of TrieNode. Then print node.children and node.isEndOfWord on separate lines.
DSA Javascript
Hint
Create const node = new TrieNode(); then use console.log(node.children); and console.log(node.isEndOfWord); to print.
Practice
(1/5)
1. What is the main purpose of a Trie node in a Trie data structure?
easy
A. To store the entire word in one node
B. To store integer values for sorting
C. To hold only the last character of a word
D. To store characters and links to child nodes representing prefixes
Solution
Step 1: Understand Trie node role
A Trie node stores a character and links to child nodes that represent possible next characters in words.
Step 2: Compare options
Only To store characters and links to child nodes representing prefixes correctly describes storing characters and child links for prefixes.
Final Answer:
To store characters and links to child nodes representing prefixes -> Option D
Quick Check:
Trie node = character + child links [OK]
Hint: Trie nodes hold characters and children, not full words [OK]
Common Mistakes:
Thinking nodes store whole words
Confusing Trie nodes with array elements
Assuming nodes only store last characters
2. Which of the following is the correct way to initialize a Trie node in JavaScript with an empty children object and a boolean flag isEndOfWord set to false?
easy
A. const node = { children: null, isEndOfWord: true };
B. const node = { children: [], isEndOfWord: false };
C. const node = { children: {}, isEndOfWord: false };
D. const node = { children: {}, isEndOfWord: true };
Solution
Step 1: Identify correct children type
Children should be an object to map characters to nodes, so {} is correct.
Step 2: Check isEndOfWord initial value
Initially, isEndOfWord should be false because the node does not end a word yet.
Empty object + false flag = correct initialization [OK]
Hint: Children is an object, isEndOfWord starts false [OK]
Common Mistakes:
Using array instead of object for children
Setting isEndOfWord true at initialization
Setting children to null
3. Consider this JavaScript code snippet for a Trie node:
class TrieNode {
constructor() {
this.children = {};
this.isEndOfWord = false;
}
}
const node = new TrieNode();
console.log(node.isEndOfWord);
console.log(Object.keys(node.children).length);
What will be the output?
medium
A. false
0
B. true
0
C. false
undefined
D. undefined
0
Solution
Step 1: Check isEndOfWord value after construction
Constructor sets isEndOfWord to false, so console.log prints false.
Step 2: Check children keys count
Children is an empty object, so Object.keys(node.children).length is 0.
Final Answer:
false
0 -> Option A
Quick Check:
isEndOfWord = false, children keys = 0 [OK]
Hint: Empty children means zero keys; isEndOfWord defaults false [OK]
Common Mistakes:
Assuming isEndOfWord is true by default
Expecting children keys length to be undefined
Confusing object keys count with children length
4. The following code attempts to create a Trie node but has an error:
function TrieNode() {
this.children = [];
this.isEndOfWord = false;
}
What is the main problem with this code?
medium
A. children should be an object, not an array
B. isEndOfWord should be true initially
C. Function should return a value
D. Missing semicolon after isEndOfWord assignment
Solution
Step 1: Analyze children data type
Children must be an object to map characters to nodes, not an array.
Step 2: Check other parts
isEndOfWord false is correct; function constructors do not need explicit return; semicolons are optional in JS.
Final Answer:
children should be an object, not an array -> Option A
Quick Check:
Children = object, not array [OK]
Hint: Children must be object for character keys, not array [OK]
Common Mistakes:
Thinking arrays can map characters
Expecting function constructors to return explicitly
Focusing on semicolon errors
5. You want to design a Trie node class in JavaScript that supports Unicode characters as keys in children and initializes isEndOfWord to false. Which of the following implementations correctly achieves this and allows adding child nodes dynamically?
hard
A. class TrieNode {
constructor() {
this.children = {};
this.isEndOfWord = true;
}
addChild(char) {
this.children[char] = new TrieNode();
}
}
B. class TrieNode {
constructor() {
this.children = new Map();
this.isEndOfWord = false;
}
addChild(char) {
if (!this.children.has(char)) {
this.children.set(char, new TrieNode());
}
}
}
C. class TrieNode {
constructor() {
this.children = [];
this.isEndOfWord = false;
}
addChild(char) {
this.children.push(char);
}
}
D. class TrieNode {
constructor() {
this.children = new Set();
this.isEndOfWord = false;
}
addChild(char) {
this.children.add(char);
}
}
Solution
Step 1: Check children data structure for Unicode support
Using Map allows any string keys including Unicode, better than plain objects.
Step 2: Verify isEndOfWord initialization and addChild method
isEndOfWord is false initially, and addChild adds new TrieNode only if missing, correctly updating children Map.
Step 3: Compare other options
class TrieNode {
constructor() {
this.children = {};
this.isEndOfWord = true;
}
addChild(char) {
this.children[char] = new TrieNode();
}
} sets isEndOfWord true initially (wrong). class TrieNode {
constructor() {
this.children = [];
this.isEndOfWord = false;
}
addChild(char) {
this.children.push(char);
}
} uses array which can't map chars to nodes. class TrieNode {
constructor() {
this.children = new Set();
this.isEndOfWord = false;
}
addChild(char) {
this.children.add(char);
}
} uses Set which stores chars but not nodes.
Final Answer:
Implementation using Map with isEndOfWord false and addChild method -> Option B