Trie Insert Operation in DSA C++ - Time & Space Complexity
We want to understand how the time to insert a word into a trie changes as the word gets longer.
How does the number of steps grow when adding more letters?
Analyze the time complexity of the following code snippet.
struct TrieNode {
TrieNode* children[26] = {nullptr};
bool isEnd = false;
};
void insert(TrieNode* root, const std::string& word) {
TrieNode* node = root;
for (char c : word) {
int index = c - 'a';
if (!node->children[index])
node->children[index] = new TrieNode();
node = node->children[index];
}
node->isEnd = true;
}
This code inserts each letter of a word into the trie, creating new nodes if needed.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Loop over each character in the word.
- How many times: Exactly once per letter in the word (word length = n).
Each letter causes one step to check or create a node, so the steps grow directly with word length.
| Input Size (n) | 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(n)
This means the time to insert grows in direct proportion to the length of the word.
[X] Wrong: "Insertion time depends on the number of words already in the trie."
[OK] Correct: The insertion only depends on the length of the word being added, not how many words are stored.
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 alphabet size from 26 to 256? 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, creating nodes if they don't exist.Step 2: Differentiate from other operations
Deleting removes words, searching checks presence, counting totals words. Insert specifically adds words.Final Answer:
To add a new word character by character into the Trie -> Option CQuick Check:
Insert = Add word [OK]
- Confusing insert with search or delete
- Thinking insert counts words
- Assuming insert replaces existing words
Solution
Step 1: Check children type for TrieNode
Children must be pointers to TrieNode to allow dynamic node creation; hence TrieNode* children[26].Step 2: Verify initialization
Initialize all children pointers to nullptr and isEnd to false in constructor.Final Answer:
class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; -> Option DQuick Check:
Children pointers + init nullptr = class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; [OK]
- Using int array instead of pointers
- Not initializing children to nullptr
- Using vector<char> instead of TrieNode pointers
Trie trie;
trie.insert("cat");
trie.insert("car");
int count = 0;
for(int i = 0; i < 26; i++) {
if(trie.root->children[i] != nullptr) count++;
}
std::cout << count << std::endl;Solution
Step 1: Insert "cat" and "car" into Trie
Both words start with 'c', so only one child node for 'c' is created at root.Step 2: Count root children nodes
Only one child at root for 'c' exists, so count is 1.Final Answer:
1 -> Option AQuick Check:
Root children count after insert = 1 [OK]
- Counting all characters instead of root children
- Assuming separate root nodes for each word
- Confusing total nodes with root children
void insert(string word) {
TrieNode* node = root;
for(char c : word) {
int index = c - 'a';
if(node->children[index] == NULL) {
node->children[index] = new TrieNode();
}
node = node->children[index];
}
node->isEnd = true;
}Solution
Step 1: Check root initialization assumption
Assuming root is properly initialized elsewhere, this code correctly uses root pointer.Step 2: Verify index calculation and loop
Index c - 'a' is correct for lowercase letters; loop over characters is valid.Final Answer:
No error; the insert function is correct -> Option AQuick Check:
Code logic matches standard insert [OK]
- Assuming uppercase letters without context
- Thinking loop must use indices
- Forgetting root initialization outside snippet
Choose the correct statement.
Solution
Step 1: Analyze existing Trie structure
Words "bat", "ball", "barn" share prefix 'ba' and 'bar' prefix exists as part of "barn".Step 2: Effect of inserting "bar"
Nodes for 'b', 'a', 'r' already exist; only isEnd flag at 'r' node is set to true to mark "bar" as a word.Final Answer:
No new nodes are created; only an existing node's isEnd flag is set -> Option BQuick Check:
Insert existing prefix sets isEnd only [OK]
- Thinking new nodes are always created
- Assuming duplicates of nodes happen
- Believing insertion fails if prefix exists
Ready to prove it?
Pass the test and this pattern moves unknown
