Skip to content

Commit c29a1e0

Browse files
authored
fix tree_sort.py
1 parent c3d4b9e commit c29a1e0

1 file changed

Lines changed: 50 additions & 40 deletions

File tree

sorts/tree_sort.py

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,82 @@
1-
"""
2-
Tree_sort algorithm.
3-
4-
Build a Binary Search Tree and then iterate thru it to get a sorted list.
5-
"""
6-
71
from __future__ import annotations
8-
92
from collections.abc import Iterator
103
from dataclasses import dataclass
114

12-
135
@dataclass
146
class Node:
7+
"""Node of a Binary Search Tree (BST) for sorting."""
158
val: int
169
left: Node | None = None
1710
right: Node | None = None
1811

1912
def __iter__(self) -> Iterator[int]:
13+
"""In-order traversal generator for BST."""
14+
# Traverse left subtree first (smaller values)
2015
if self.left:
2116
yield from self.left
17+
18+
# Current node value
2219
yield self.val
20+
21+
# Traverse right subtree last (larger values)
2322
if self.right:
2423
yield from self.right
2524

26-
def __len__(self) -> int:
27-
return sum(1 for _ in self)
28-
2925
def insert(self, val: int) -> None:
30-
if val < self.val:
26+
"""Insert value into BST while maintaining sort order."""
27+
# Values <= current go to left subtree
28+
if val <= self.val:
3129
if self.left is None:
3230
self.left = Node(val)
3331
else:
3432
self.left.insert(val)
35-
elif val > self.val:
33+
# Values > current go to right subtree
34+
else:
3635
if self.right is None:
3736
self.right = Node(val)
3837
else:
3938
self.right.insert(val)
4039

4140

42-
def tree_sort(arr: list[int]) -> tuple[int, ...]:
41+
def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]:
4342
"""
44-
>>> tree_sort([])
45-
()
46-
>>> tree_sort((1,))
47-
(1,)
48-
>>> tree_sort((1, 2))
49-
(1, 2)
50-
>>> tree_sort([5, 2, 7])
51-
(2, 5, 7)
52-
>>> tree_sort((5, -4, 9, 2, 7))
53-
(-4, 2, 5, 7, 9)
54-
>>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7])
55-
(-1, 1, 2, 4, 5, 6, 7, 37)
56-
57-
# >>> tree_sort(range(10, -10, -1)) == tuple(sorted(range(10, -10, -1)))
58-
# True
43+
Sort sequence using Binary Search Tree (BST) traversal.
44+
45+
Args:
46+
arr: Input sequence (list or tuple of integers)
47+
48+
Returns:
49+
Tuple of sorted integers
50+
51+
Examples:
52+
>>> tree_sort([])
53+
()
54+
>>> tree_sort((1,))
55+
(1,)
56+
>>> tree_sort((1, 2))
57+
(1, 2)
58+
>>> tree_sort([5, 2, 7])
59+
(2, 5, 7)
60+
>>> tree_sort((5, -4, 9, 2, 7))
61+
(-4, 2, 5, 7, 9)
62+
>>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7])
63+
(-1, 1, 2, 4, 5, 6, 7, 37)
64+
>>> tree_sort([5, 2, 7, 5]) # Test duplicate handling
65+
(2, 5, 5, 7)
5966
"""
60-
if len(arr) == 0:
61-
return tuple(arr)
62-
root = Node(arr[0])
63-
for item in arr[1:]:
67+
# Handle empty input immediately
68+
if not arr:
69+
return ()
70+
71+
# Convert to list for uniform processing
72+
items = list(arr)
73+
74+
# Initialize BST root with first element
75+
root = Node(items[0])
76+
77+
# Insert remaining items into BST
78+
for item in items[1:]:
6479
root.insert(item)
80+
81+
# Convert BST traversal to sorted tuple
6582
return tuple(root)
66-
67-
68-
if __name__ == "__main__":
69-
import doctest
70-
71-
doctest.testmod()
72-
print(f"{tree_sort([5, 6, 1, -1, 4, 37, -3, 7]) = }")

0 commit comments

Comments
 (0)