From cd6aa289cc1726152000a541467236701ddcdd1e Mon Sep 17 00:00:00 2001 From: gabriellypinto Date: Sat, 7 Oct 2023 11:03:50 -0300 Subject: [PATCH 1/3] add tests for tree_sort --- sorts/tree_sort.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index 78c3e893e0ce..4e679303dafe 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -37,6 +37,18 @@ def inorder(root, res): def tree_sort(arr): + """ + + >>> 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] + + """ # Build BST if len(arr) == 0: return arr @@ -50,4 +62,7 @@ def tree_sort(arr): if __name__ == "__main__": - print(tree_sort([10, 1, 3, 2, 9, 14, 13])) + import doctest + + doctest.testmod() + From e42a5192286f52084f531f39692bd6c0ffc1c700 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 14:05:33 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sorts/tree_sort.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index 4e679303dafe..1781d55aeee1 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -44,10 +44,10 @@ def tree_sort(arr): >>> 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] - + """ # Build BST if len(arr) == 0: @@ -65,4 +65,3 @@ def tree_sort(arr): import doctest doctest.testmod() - From e38dd968713a434c94431857a114c9eba800bfb1 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 16 Oct 2023 02:41:24 +0200 Subject: [PATCH 3/3] Update tree_sort.py --- sorts/tree_sort.py | 89 ++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/sorts/tree_sort.py b/sorts/tree_sort.py index 1781d55aeee1..e63a3253ba19 100644 --- a/sorts/tree_sort.py +++ b/sorts/tree_sort.py @@ -1,67 +1,70 @@ """ Tree_sort algorithm. -Build a BST and in order traverse. +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: - # BST data structure - def __init__(self, val): - self.val = val - self.left = None - self.right = None + val: int + left: Node | None = None + right: Node | None = None - def insert(self, val): - if self.val: - if val < self.val: - if self.left is None: - self.left = Node(val) - else: - self.left.insert(val) - elif val > self.val: - if self.right is None: - self.right = Node(val) - else: - self.right.insert(val) - else: - self.val = val + def __iter__(self) -> Iterator[int]: + if self.left: + yield from self.left + yield self.val + if self.right: + yield from self.right + def __len__(self) -> int: + return sum(1 for _ in self) -def inorder(root, res): - # Recursive traversal - if root: - inorder(root.left, res) - res.append(root.val) - inorder(root.right, res) + def insert(self, val: int) -> None: + if val < self.val: + if self.left is None: + self.left = Node(val) + else: + self.left.insert(val) + elif val > self.val: + if self.right is None: + self.right = Node(val) + else: + self.right.insert(val) -def tree_sort(arr): +def tree_sort(arr: list[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] - + (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] - + (-1, 1, 2, 4, 5, 6, 7, 37) + >>> tree_sort(range(10, -10, -1)) == tuple(sorted(range(10, -10, -1))) + True """ - # Build BST if len(arr) == 0: - return arr + return tuple(arr) root = Node(arr[0]) - for i in range(1, len(arr)): - root.insert(arr[i]) - # Traverse BST in order. - res = [] - inorder(root, res) - return res + for item in arr[1:]: + root.insert(item) + return tuple(root) if __name__ == "__main__": import doctest doctest.testmod() + print(f"{tree_sort([5, 6, 1, -1, 4, 37, -3, 7]) = }")