class TrieNode {
children: Map<string, TrieNode> = new Map();
isEndOfWord: boolean = false;
}
class Trie {
root: TrieNode = new TrieNode();
insert(word: string): void {
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)!; // advance node to child
}
node.isEndOfWord = true; // mark end of word
}
searchPrefix(prefix: string): TrieNode | null {
let node = this.root;
for (const char of prefix) {
if (!node.children.has(char)) {
return null; // prefix not found
}
node = node.children.get(char)!; // advance node
}
return node; // node at prefix end
}
collectAllWords(node: TrieNode, prefix: string, results: string[]): void {
if (node.isEndOfWord) {
results.push(prefix); // found a word
}
for (const [char, childNode] of node.children) {
this.collectAllWords(childNode, prefix + char, results); // recurse children
}
}
autocomplete(prefix: string): string[] {
const results: string[] = [];
const node = this.searchPrefix(prefix);
if (!node) return results; // no words with prefix
this.collectAllWords(node, prefix, results); // gather words
return results;
}
}
// Driver code
const trie = new Trie();
["cat", "car", "care"].forEach(word => trie.insert(word));
const prefix = "ca";
const completions = trie.autocomplete(prefix);
console.log(`Words with prefix '${prefix}': ["${completions.join('", "')}"]`);if (!node.children.has(char)) { node.children.set(char, new TrieNode()); }
Create new child node if letter path missing
node = node.children.get(char)!;
Advance node pointer to child node for current letter
Mark node as end of a valid word
if (!node.children.has(char)) { return null; }
Stop search if prefix letter path missing
Return node at end of prefix path
if (node.isEndOfWord) { results.push(prefix); }
Add word to results when end of word reached
this.collectAllWords(childNode, prefix + char, results);
Recursively explore all child nodes to collect words
const node = this.searchPrefix(prefix); if (!node) return results;
Find prefix node or return empty if not found
this.collectAllWords(node, prefix, results);
Collect all words starting from prefix node
Words with prefix 'ca': ["cat", "car", "care"]