Trie Insert Operation in DSA Typescript - Time & Space Complexity
We want to understand how the time to add a word to a trie grows as the word gets longer.
How does the number of steps change when the word length increases?
Analyze the time complexity of the following code snippet.
class TrieNode {
children: Map = new Map();
isEndOfWord: boolean = false;
}
function insert(root: TrieNode, word: string): void {
let node = root;
for (const char of word) {
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
node = node.children.get(char)!;
}
node.isEndOfWord = true;
}
This code adds each character of a word into the trie, creating new nodes if needed.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each character of the word.
- How many times: Exactly once per character in the word (word length).
Each added character means one more step in the loop, so the work grows directly with word length.
| Input Size (word length) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The time grows linearly as the word gets longer.
Time Complexity: O(m)
This means the time to insert depends directly on the length of the word being added.
[X] Wrong: "The insert time depends on the number of words already in the trie."
[OK] Correct: The insert only loops through the new word's characters, not all stored words, so existing size doesn't affect insert time.
Knowing this helps you explain why tries are efficient for prefix searches and insertions, a common topic in coding interviews.
What if we changed the data structure to use an array of fixed size 26 for children instead of a map? How would the time complexity change?
Practice
insert operation in a Trie data structure?Solution
Step 1: Understand the insert operation
The insert operation adds each character of a word into the Trie one by one, creating new nodes if needed.Step 2: Differentiate from other operations
Deleting removes words, searching finds words, counting totals words. Insert specifically adds words.Final Answer:
To add a word character by character into the Trie -> Option AQuick Check:
Insert = Add word [OK]
- Confusing insert with search or delete
- Thinking insert counts words
- Assuming insert replaces words
root?Solution
Step 1: Understand variable declaration in TypeScript
Usingletdeclares a variable that can be reassigned, suitable for traversal nodes.Step 2: Check syntax correctness
let node = root; uses correct assignment withlet. node = root; misses declaration keyword. const node = root() wrongly calls root as a function. var node == root; uses invalid comparison operator.Final Answer:
let node = root; -> Option AQuick Check:
Correct variable declaration = let node = root; [OK]
- Missing let or const keyword
- Using == instead of = for assignment
- Calling node as a function
class TrieNode {
children: Map = new Map();
isEndOfWord = false;
}
const root = new TrieNode();
function insert(word: string) {
let node = root;
for (const char of word) {
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
node = node.children.get(char)!;
}
node.isEndOfWord = true;
}
insert("cat");
console.log(Array.from(root.children.keys()));Solution
Step 1: Trace insertion of "cat" into Trie
Starting at root, 'c' is not present, so a new node for 'c' is created. Then move to 'c' node, 'a' is added as child, then 't' as child of 'a'.Step 2: Check root's children keys
Root only has one child node for 'c'. The keys of root.children are ['c'].Final Answer:
["c"] -> Option DQuick Check:
Root children keys after insert = ["c"] [OK]
- Expecting all letters at root level
- Confusing keys with full words
- Ignoring Map keys method
function insert(word: string) {
let node = root;
for (const char of word) {
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
node = node.children.get(char);
}
node.isEndOfWord = true;
}Solution
Step 1: Check new object creation syntax
In TypeScript, when creating a new object, parentheses are required even if no arguments are passed.new TrieNodeshould benew TrieNode().Step 2: Verify other parts
Using 'let' for node is fine since node changes. The get method is safe here because we just set the key if missing. isEndOfWord is set at the end, initial value doesn't cause error.Final Answer:
Missing parentheses when creating new TrieNode -> Option BQuick Check:
new object needs () [OK]
- Omitting () after new keyword
- Confusing let and const for variables
- Ignoring possible undefined from get()
Solution
Step 1: Analyze common prefixes in words
Words "bat", "ball", and "batman" share prefix 'b' -> 'a'. From 'a', 't' leads to "bat" and "batman", 'l' leads to "ball".Step 2: Understand Trie branching
Node 'b' has child 'a'. Node 'a' branches to 't' and 'l'. 'm' is child of 'a'->'t'->'m' for "batman". So 'm' is not direct child of 'b'.Final Answer:
The node for 'b' has children 'a' only, and 'a' has children 't' and 'l' -> Option CQuick Check:
Trie branches at shared prefixes [OK]
- Assuming all words start new branches at root
- Thinking 'm' is direct child of 'b'
- Confusing end of word nodes
Ready to prove it?
Pass the test and this pattern moves unknown
