Skip to content
Merged
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
275dcfd
Fixes The Bug In Radix Tree. Issue #11316
rtron-24 Apr 25, 2024
87aec39
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
394802a
Added Ruff Recommendations
rtron-24 Apr 25, 2024
441efe5
Merge branch 'turing-code' of https://github.com/covid-in/TheAlgorith…
rtron-24 Apr 25, 2024
e58ca10
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
becc449
Ruff Fixes : E501 Line too long
rtron-24 Apr 25, 2024
8dca3e8
Merge branch 'turing-code' of https://github.com/covid-in/TheAlgorith…
rtron-24 Apr 25, 2024
7b3b391
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
c9207e2
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
af76a5e
Ruff Fixes : E501 Line too long
rtron-24 Apr 25, 2024
3e4a386
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
ded2837
Merge branch 'turing-code' of https://github.com/covid-in/TheAlgorith…
rtron-24 Apr 25, 2024
298959e
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
0d53bc7
Fixes Ruff Error
rtron-24 Apr 25, 2024
25a8610
Merge branch 'turing-code' of https://github.com/covid-in/TheAlgorith…
rtron-24 Apr 25, 2024
00f1dd4
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 25, 2024
66588e9
Ruff All Fixes
rtron-24 Apr 25, 2024
004fdf7
Merge branch 'turing-code' of https://github.com/covid-in/TheAlgorith…
rtron-24 Apr 25, 2024
4da3e1c
Improve comments in radix_tree.py
cclauss Sep 10, 2026
ff5b7fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 10, 2026
4b2c606
Add test function for RadixNode operations
cclauss Sep 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 43 additions & 20 deletions data_structures/trie/radix_tree.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
"""
A Radix Tree is a data structure that represents a space-optimized
trie (prefix tree) in whicheach node that is the only child is merged
trie (prefix tree) in which each node that is the only child is merged
with its parent [https://en.wikipedia.org/wiki/Radix_tree]
"""

import unittest


class RadixNode:
def __init__(self, prefix: str = "", is_leaf: bool = False) -> None:
Expand Down Expand Up @@ -62,6 +64,11 @@ def insert(self, word: str) -> None:
-- A (leaf)
--- A (leaf)
"""
## Handle the Case where the word is empty by using an if branch
if word == "":
self.is_leaf = True
return

# Case 1: If the word is the prefix of the node
# Solution: We set the current node as leaf
if self.prefix == word and not self.is_leaf:
Expand All @@ -80,11 +87,11 @@ def insert(self, word: str) -> None:
)

# Case 3: The node prefix is equal to the matching
# Solution: We insert remaining word on the next node
# Solution: We insert the remaining word on the next node
if remaining_prefix == "":
self.nodes[matching_string[0]].insert(remaining_word)

# Case 4: The word is greater equal to the matching
# Case 4: The word is greater than or equal to the matching
# Solution: Create a node in between both nodes, change
# prefixes and add the new node for the remaining word
else:
Expand All @@ -100,7 +107,7 @@ def insert(self, word: str) -> None:
self.nodes[matching_string[0]].insert(remaining_word)

def find(self, word: str) -> bool:
"""Returns if the word is on the tree
"""Returns whether the word is on the tree

Args:
word (str): word to check
Expand Down Expand Up @@ -191,7 +198,7 @@ def print_tree(self, height: int = 0) -> None:
value.print_tree(height + 1)


def test_trie() -> bool:
def test_trie() -> None:
words = "banana bananas bandana band apple all beast".split()
root = RadixNode()
root.insert_many(words)
Expand All @@ -205,25 +212,41 @@ def test_trie() -> bool:
assert not root.find("banana")
assert root.find("bananas")

return True

class TestRadixNode(unittest.TestCase):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This boilerplate adds unnecessary complexity.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure Will Remove it. But its the best way to do this

def test_trie(self) -> None:
words = "banana bananas bandana band apple all beast".split()
root = RadixNode()
root.insert_many(words)

def pytests() -> None:
assert test_trie()
assert all(root.find(word) for word in words)
assert not root.find("bandanas")
assert not root.find("apps")
root.delete("all")
assert not root.find("all")
root.delete("banana")
assert not root.find("banana")
assert root.find("bananas")

def test_trie_2(self) -> None:
"""
Now add a new test case that inserts
foobbb, fooaaa, foo in the given order and checks
for different assertions
"""
words = "foobbb fooaaa foo".split()
root = RadixNode()
root.insert_many(words)

def main() -> None:
"""
>>> pytests()
"""
root = RadixNode()
words = "banana bananas bandanas bandana band apple all beast".split()
root.insert_many(words)

print("Words:", words)
print("Tree:")
root.print_tree()
assert all(root.find(word) for word in words)
root.delete("foo")
assert not root.find("foo")
assert root.find("foobbb")
assert root.find("fooaaa")


if __name__ == "__main__":
main()
import doctest

doctest.testmod()
unittest.main()
Loading