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 end of prefix
}
collectAllWords(node: TrieNode | null, prefix: string, words: string[]): void {
if (!node) return;
if (node.isEndOfWord) {
words.push(prefix); // found a word
}
for (const [char, childNode] of node.children) {
this.collectAllWords(childNode, prefix + char, words); // recurse children
}
}
getWordsWithPrefix(prefix: string): string[] {
const node = this.searchPrefix(prefix);
if (!node) return [];
const words: string[] = [];
this.collectAllWords(node, prefix, words);
return words;
}
}
// Driver code
const trie = new Trie();
const words = ["tree", "trie", "algo", "assoc", "all", "also"];
for (const word of words) {
trie.insert(word);
}
const prefix = "tr";
const result = trie.getWordsWithPrefix(prefix);
console.log(`Words with prefix '${prefix}': ["${result.join('", "')}"]`);start from root to insert or search
if (!node.children.has(char)) { node.children.set(char, new TrieNode()); }
create new node if letter path does not exist
node = node.children.get(char)!;
advance node to next letter in word or prefix
mark node as end of a valid word
if (!node.children.has(char)) { return null; }
stop search if prefix letter missing
if (node.isEndOfWord) { words.push(prefix); }
collect word when end of word node reached
this.collectAllWords(childNode, prefix + char, words);
recursively collect all words under current node
Words with prefix 'tr': ["tree", "trie"]