Skip to content

Commit 4f29d20

Browse files
authored
Fix insertion fail in ["*X", "*XX"] cases
Consider a word, and a copy of that word, but with the last letter repeating twice. (e.g., ["ABC", "ABCC"]) When adding the second word's last letter, it only compares the previous word's prefix—the last letter of the word already in the Radix Tree: 'C'—and the letter to be added—the last letter of the word we're currently adding: 'C'. So it wrongly passes the "Case 1" check, marks the current node as a leaf node when it already was, then returns when there's still one more letter to add. The issue arises because `prefix` includes the letter of the node itself. (e.g., `nodes: {'C' : RadixNode()}, is_leaf: True, prefix: 'C'`) It can be easily fixed by simply adding the `is_leaf` check, asking if there are more letters to be added. - Test Case: `"A AA AAA AAAA"` - Fixed correct output: ``` Words: ['A', 'AA', 'AAA', 'AAAA'] Tree: - A (leaf) -- A (leaf) --- A (leaf) ---- A (leaf) ``` - Current incorrect output: ``` Words: ['A', 'AA', 'AAA', 'AAAA'] Tree: - A (leaf) -- AA (leaf) --- A (leaf) ``` *N.B.* This passed test cases for [Croatian Open Competition in Informatics 2012/2013 Contest TheAlgorithms#3 Task 5 HERKABE](https://hsin.hr/coci/archive/2012_2013/)
1 parent f614ed7 commit 4f29d20

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

Diff for: data_structures/trie/radix_tree.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def insert(self, word: str) -> None:
5757
"""
5858
# Case 1: If the word is the prefix of the node
5959
# Solution: We set the current node as leaf
60-
if self.prefix == word:
60+
if self.prefix == word and not self.is_leaf:
6161
self.is_leaf = True
6262

6363
# Case 2: The node has no edges that have a prefix to the word

0 commit comments

Comments
 (0)