Bird
Raised Fist0
DSA Javascriptprogramming

Word Search in Trie in DSA Javascript

Choose your learning style10 modes available
Mental Model
A trie stores words by sharing common letters in a tree. Searching means following letters down the branches.
Analogy: Imagine a tree where each branch is a letter. To find a word, you walk down the branches matching each letter in order.
root
 ↓
  t -> e -> a
        ↑
      curr
Dry Run Walkthrough
Input: Trie with words: 'to', 'tea', 'ted', 'ten', search for 'tea'
Goal: Find if the word 'tea' exists in the trie
Step 1: Start at root, look for 't'
root -> [t] -> e -> a
Why: First letter 't' must be found among root's children
Step 2: Move to node 't', look for 'e'
root -> t -> [e] -> a -> null
Why: Second letter 'e' must be found among 't' node's children
Step 3: Move to node 'e', look for 'a'
root -> t -> e -> [a] -> null
Why: Third letter 'a' must be found among 'e' node's children
Step 4: Check if 'a' node marks end of word
root -> t -> e -> a* (end)
Why: Confirm the word ends here to ensure full match
Result:
root -> t -> e -> a* (end)
Word 'tea' found: true
Annotated Code
DSA Javascript
class TrieNode {
  constructor() {
    this.children = new Map();
    this.isEndOfWord = false;
  }
}

class Trie {
  constructor() {
    this.root = new TrieNode();
  }

  insert(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children.has(char)) {
        node.children.set(char, new TrieNode());
      }
      node = node.children.get(char); // move down the trie
    }
    node.isEndOfWord = true; // mark end of word
  }

  search(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children.has(char)) {
        return false; // letter missing, word not found
      }
      node = node.children.get(char); // move down the trie
    }
    return node.isEndOfWord; // true if word ends here
  }
}

// Driver code
const trie = new Trie();
['to', 'tea', 'ted', 'ten'].forEach(word => trie.insert(word));
console.log(trie.search('tea'));
node = node.children.get(char); // move down the trie
advance node pointer to child matching current letter
node.isEndOfWord = true; // mark end of word
mark current node as end of a valid word
if (!node.children.has(char)) { return false; }
stop search early if letter missing in children
return node.isEndOfWord; // true if word ends here
confirm full word match by checking end marker
OutputSuccess
true
Complexity Analysis
Time: O(m) because we check each of the m letters in the word once
Space: O(n*m) where n is number of words and m average length, for storing trie nodes
vs Alternative: Compared to searching a list of words (O(n*m)), trie search is faster (O(m)) by direct letter traversal
Edge Cases
searching empty string
returns false because empty word is not stored
DSA Javascript
return node.isEndOfWord; // true if word ends here
searching word not in trie
returns false early when letter missing
DSA Javascript
if (!node.children.has(char)) { return false; }
searching prefix of a word but not a full word
returns false because end marker is missing
DSA Javascript
return node.isEndOfWord; // true if word ends here
When to Use This Pattern
When you need to quickly check if words or prefixes exist in a large set, use a trie search pattern because it follows letters step-by-step efficiently.
Common Mistakes
Mistake: Not checking if the node marks the end of a word after traversal
Fix: Always check the isEndOfWord flag to confirm full word match
Mistake: Trying to access children without checking if the letter exists
Fix: Check if children has the letter before moving down to avoid errors
Summary
It checks if a word exists by following letters down a tree of shared prefixes.
Use it when you want fast word lookups among many stored words.
The key is to move letter by letter and confirm the word ends exactly at the last letter.

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

  1. Step 1: Understand Trie structure

    A Trie stores characters of words in a tree where each node represents a character.
  2. Step 2: Identify Trie usage

    It allows quick prefix-based search by traversing nodes matching characters.
  3. Final Answer:

    To efficiently store and search words by their prefixes -> Option A
  4. 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

  1. Step 1: Understand Trie search method

    Search involves traversing nodes for each character and checking if the word ends at last node.
  2. Step 2: Eliminate incorrect options

    Array.includes and JSON.stringify are not suitable for Trie structure. Math.max is unrelated.
  3. Final Answer:

    Use a loop to traverse nodes matching each character and check end flag -> Option A
  4. 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

  1. Step 1: Insert words 'cat' and 'car'

    Both words are added character by character, marking end nodes for 't' and 'r'.
  2. Step 2: Search 'cat' and 'cap'

    'cat' exists with isEnd true, 'cap' path breaks at 'p' missing node, returns false.
  3. Final Answer:

    true false -> Option C
  4. 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

  1. Step 1: Analyze current search return

    Returns true if path exists but does not check if word ends here.
  2. Step 2: Correct return value

    Must return node.isEnd to confirm the word is complete, not just prefix.
  3. Final Answer:

    Return node.isEnd instead of true to confirm full word match -> Option D
  4. 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

  1. Step 1: Insert all words into Trie

    Build Trie so each word is represented by a path of nodes.
  2. Step 2: Traverse prefix nodes and collect words

    Find node matching prefix end, then recursively collect all words below it.
  3. 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.
  4. Final Answer:

    Insert all words into Trie, traverse prefix nodes, then collect all descendant words -> Option B
  5. Quick Check:

    Trie + prefix traversal = efficient prefix search [OK]
Hint: Use Trie prefix traversal then gather descendant words [OK]
Common Mistakes:
  • Ignoring Trie traversal for prefix
  • Using slow linear search for prefix
  • Confusing hash map with Trie
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