From c29a1e0a3e50a41ee7b5a8a6378092a10c5a4227 Mon Sep 17 00:00:00 2001 From: lighting9999 <120090117+lighting9999@users.noreply.github.com> Date: Sat, 7 Jun 2025 17:01:40 +0800 Subject: [PATCH 1/4] fix tree_sort.py --- sorts/tree_sort.py | 90 +++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index 056864957d4d..a6c9c25ab33e 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -1,72 +1,82 @@ -""" -Tree_sort algorithm. - -Build a Binary Search Tree and then iterate thru it to get a sorted list. -""" - from __future__ import annotations - from collections.abc import Iterator from dataclasses import dataclass - @dataclass class Node: + """Node of a Binary Search Tree (BST) for sorting.""" val: int left: Node | None = None right: Node | None = None def __iter__(self) -> Iterator[int]: + """In-order traversal generator for BST.""" + # Traverse left subtree first (smaller values) if self.left: yield from self.left + + # Current node value yield self.val + + # Traverse right subtree last (larger values) if self.right: yield from self.right - def __len__(self) -> int: - return sum(1 for _ in self) - def insert(self, val: int) -> None: - if val < self.val: + """Insert value into BST while maintaining sort order.""" + # Values <= current go to left subtree + if val <= self.val: if self.left is None: self.left = Node(val) else: self.left.insert(val) - elif val > self.val: + # Values > current go to right subtree + else: if self.right is None: self.right = Node(val) else: self.right.insert(val) -def tree_sort(arr: list[int]) -> tuple[int, ...]: +def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: """ - >>> tree_sort([]) - () - >>> tree_sort((1,)) - (1,) - >>> tree_sort((1, 2)) - (1, 2) - >>> tree_sort([5, 2, 7]) - (2, 5, 7) - >>> tree_sort((5, -4, 9, 2, 7)) - (-4, 2, 5, 7, 9) - >>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7]) - (-1, 1, 2, 4, 5, 6, 7, 37) - - # >>> tree_sort(range(10, -10, -1)) == tuple(sorted(range(10, -10, -1))) - # True + Sort sequence using Binary Search Tree (BST) traversal. + + Args: + arr: Input sequence (list or tuple of integers) + + Returns: + Tuple of sorted integers + + Examples: + >>> tree_sort([]) + () + >>> tree_sort((1,)) + (1,) + >>> tree_sort((1, 2)) + (1, 2) + >>> tree_sort([5, 2, 7]) + (2, 5, 7) + >>> tree_sort((5, -4, 9, 2, 7)) + (-4, 2, 5, 7, 9) + >>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7]) + (-1, 1, 2, 4, 5, 6, 7, 37) + >>> tree_sort([5, 2, 7, 5]) # Test duplicate handling + (2, 5, 5, 7) """ - if len(arr) == 0: - return tuple(arr) - root = Node(arr[0]) - for item in arr[1:]: + # Handle empty input immediately + if not arr: + return () + + # Convert to list for uniform processing + items = list(arr) + + # Initialize BST root with first element + root = Node(items[0]) + + # Insert remaining items into BST + for item in items[1:]: root.insert(item) + + # Convert BST traversal to sorted tuple return tuple(root) - - -if __name__ == "__main__": - import doctest - - doctest.testmod() - print(f"{tree_sort([5, 6, 1, -1, 4, 37, -3, 7]) = }") From e9c7bacf29dcbc6afe9288109510f371f3cdf0b6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 09:04:30 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sorts/tree_sort.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index a6c9c25ab33e..a99f1d496ca7 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -2,9 +2,11 @@ from collections.abc import Iterator from dataclasses import dataclass + @dataclass class Node: """Node of a Binary Search Tree (BST) for sorting.""" + val: int left: Node | None = None right: Node | None = None @@ -14,10 +16,10 @@ def __iter__(self) -> Iterator[int]: # Traverse left subtree first (smaller values) if self.left: yield from self.left - + # Current node value yield self.val - + # Traverse right subtree last (larger values) if self.right: yield from self.right @@ -41,13 +43,13 @@ def insert(self, val: int) -> None: def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: """ Sort sequence using Binary Search Tree (BST) traversal. - + Args: arr: Input sequence (list or tuple of integers) - + Returns: Tuple of sorted integers - + Examples: >>> tree_sort([]) () @@ -67,16 +69,16 @@ def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: # Handle empty input immediately if not arr: return () - + # Convert to list for uniform processing items = list(arr) - + # Initialize BST root with first element root = Node(items[0]) - + # Insert remaining items into BST for item in items[1:]: root.insert(item) - + # Convert BST traversal to sorted tuple return tuple(root) From 1ceb911b0ae6a9005b626637e36ad69b7cae3d8a Mon Sep 17 00:00:00 2001 From: lighting9999 <120090117+lighting9999@users.noreply.github.com> Date: Sat, 7 Jun 2025 17:07:37 +0800 Subject: [PATCH 3/4] Update tree_sort.py --- sorts/tree_sort.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index a99f1d496ca7..1ee4b7b8f4ec 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -1,4 +1,5 @@ from __future__ import annotations + from collections.abc import Iterator from dataclasses import dataclass @@ -6,7 +7,6 @@ @dataclass class Node: """Node of a Binary Search Tree (BST) for sorting.""" - val: int left: Node | None = None right: Node | None = None @@ -16,10 +16,10 @@ def __iter__(self) -> Iterator[int]: # Traverse left subtree first (smaller values) if self.left: yield from self.left - + # Current node value yield self.val - + # Traverse right subtree last (larger values) if self.right: yield from self.right @@ -33,23 +33,22 @@ def insert(self, val: int) -> None: else: self.left.insert(val) # Values > current go to right subtree + elif self.right is None: + self.right = Node(val) else: - if self.right is None: - self.right = Node(val) - else: - self.right.insert(val) + self.right.insert(val) def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: """ Sort sequence using Binary Search Tree (BST) traversal. - + Args: arr: Input sequence (list or tuple of integers) - + Returns: Tuple of sorted integers - + Examples: >>> tree_sort([]) () @@ -69,16 +68,16 @@ def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: # Handle empty input immediately if not arr: return () - + # Convert to list for uniform processing items = list(arr) - + # Initialize BST root with first element root = Node(items[0]) - + # Insert remaining items into BST for item in items[1:]: root.insert(item) - + # Convert BST traversal to sorted tuple return tuple(root) From e113d53141b58fadb2d3a667aaf4bba3556f85dd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 09:08:00 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sorts/tree_sort.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index 1ee4b7b8f4ec..0c11b1efde16 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -7,6 +7,7 @@ @dataclass class Node: """Node of a Binary Search Tree (BST) for sorting.""" + val: int left: Node | None = None right: Node | None = None @@ -16,10 +17,10 @@ def __iter__(self) -> Iterator[int]: # Traverse left subtree first (smaller values) if self.left: yield from self.left - + # Current node value yield self.val - + # Traverse right subtree last (larger values) if self.right: yield from self.right @@ -42,13 +43,13 @@ def insert(self, val: int) -> None: def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: """ Sort sequence using Binary Search Tree (BST) traversal. - + Args: arr: Input sequence (list or tuple of integers) - + Returns: Tuple of sorted integers - + Examples: >>> tree_sort([]) () @@ -68,16 +69,16 @@ def tree_sort(arr: list[int] | tuple[int, ...]) -> tuple[int, ...]: # Handle empty input immediately if not arr: return () - + # Convert to list for uniform processing items = list(arr) - + # Initialize BST root with first element root = Node(items[0]) - + # Insert remaining items into BST for item in items[1:]: root.insert(item) - + # Convert BST traversal to sorted tuple return tuple(root)