Bird
Raised Fist0
DSA Javascriptprogramming

Trie Insert Operation in DSA Javascript

Choose your learning style10 modes available
Mental Model
A trie stores words by sharing common prefixes in a tree structure, adding new letters as branches.
Analogy: Imagine a tree of roads where each letter is a street sign; inserting a word means building new streets only where needed.
root
 ↓
 {}  (empty root node with no children)
Dry Run Walkthrough
Input: Insert words: 'cat', then 'car'
Goal: Build a trie that stores both words sharing the prefix 'ca'
Step 1: Insert 'c' from 'cat' at root
root
 ↓
 {c: {}}
Why: Start the branch for the first letter 'c'
Step 2: Insert 'a' after 'c'
root
 ↓
 {c: {a: {}}}
Why: Add next letter 'a' as child of 'c'
Step 3: Insert 't' after 'a' and mark end of word
root
 ↓
 {c: {a: {t: {end: true}}}}
Why: Complete word 'cat' by adding 't' and marking word end
Step 4: Insert 'c' from 'car' (already exists)
root
 ↓
 {c: {a: {t: {end: true}}}}
Why: Reuse existing 'c' node for new word
Step 5: Insert 'a' after 'c' (already exists)
root
 ↓
 {c: {a: {t: {end: true}}}}
Why: Reuse existing 'a' node for new word
Step 6: Insert 'r' after 'a' and mark end of word
root
 ↓
 {c: {a: {t: {end: true}, r: {end: true}}}}
Why: Add new branch 'r' to complete 'car'
Result:
root
 ↓
 {c: {a: {t: {end: true}, r: {end: true}}}}
Annotated Code
DSA Javascript
class TrieNode {
  constructor() {
    this.children = {};
    this.end = 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]; // advance to child node
    }
    node.end = true; // mark end of word
  }

  print(node = this.root, prefix = '') {
    if (node.end) {
      console.log(prefix);
    }
    for (const char in node.children) {
      this.print(node.children[char], prefix + char);
    }
  }
}

const trie = new Trie();
trie.insert('cat');
trie.insert('car');
trie.print();
for (const char of word) {
iterate over each letter in the word
if (!node.children[char]) {
check if current letter branch exists
node.children[char] = new TrieNode();
create new node if branch missing
node = node.children[char]; // advance to child node
move down to the child node for next letter
node.end = true; // mark end of word
mark current node as end of a valid word
OutputSuccess
cat car
Complexity Analysis
Time: O(m) because we process each of the m letters in the word once
Space: O(m) in worst case when all letters are new and need new nodes
vs Alternative: Compared to storing words in a list, trie insert is faster for prefix queries but uses more space
Edge Cases
Inserting empty string
Marks root as end of word without adding children
DSA Javascript
node.end = true; // mark end of word
Inserting word already in trie
No new nodes created, just marks end again
DSA Javascript
if (!node.children[char]) {
Inserting word with shared prefix
Reuses existing nodes for prefix, adds new nodes only for suffix
DSA Javascript
if (!node.children[char]) {
When to Use This Pattern
When you need to store many words and quickly check prefixes, use a trie insert pattern to build a prefix tree efficiently.
Common Mistakes
Mistake: Not marking the end of word node, so words are not recognized as complete
Fix: Always set node.end = true after inserting all letters
Mistake: Overwriting existing child nodes instead of checking if they exist
Fix: Check if child exists before creating new node
Summary
Inserts words letter by letter into a tree structure sharing prefixes.
Use when you want fast prefix-based word storage and lookup.
The key is to reuse existing nodes for shared prefixes and mark word ends.

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

  1. 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.
  2. Step 2: Compare with other operations

    Deleting removes words, searching finds words, and counting totals words, but insert specifically adds words.
  3. Final Answer:

    To add a new word character by character into the Trie -> Option D
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    for (let char of word) { if (!node.children[char]) node.children[char] = new TrieNode(); node = node.children[char]; } -> Option A
  4. Quick Check:

    Loop chars, create missing nodes, move node [OK]
Hint: Loop chars, create missing nodes, move node [OK]
Common Mistakes:
  • Not creating nodes when missing
  • Assigning whole word as one child
  • Not updating current node pointer
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

  1. Step 1: Insert "bat" into empty Trie

    Creates nodes b -> a -> t with t's isEnd true.
  2. Step 2: Insert "ball" next

    Nodes b -> a exist, then add l -> l with last l's isEnd true.
  3. Final Answer:

    {"b":{"a":{"t":{"isEnd":true},"l":{"l":{"isEnd":true}}}}} -> Option C
  4. 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

  1. 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.
  2. Step 2: Confirm correct pointer update

    Correct is node = node.children[char] to move down the Trie properly.
  3. Final Answer:

    node is assigned to node.children instead of node.children[char] -> Option B
  4. 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

  1. 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.
  2. 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.
  3. 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
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard