|
| 1 | +""" |
| 2 | +Implement an algorithm for inserting a number into a BST tree, and then write a program which, |
| 3 | +for a given number k, checks whether k occurs in such a tree. |
| 4 | +""" |
| 5 | +from utilities.generator import Generator |
| 6 | + |
| 7 | + |
| 8 | +class TreeNode: |
| 9 | + def __init__(self, value: int) -> None: |
| 10 | + self.value: int = value |
| 11 | + self.left_side: [None | TreeNode] = None |
| 12 | + self.right_side: [None | TreeNode] = None |
| 13 | + |
| 14 | + |
| 15 | +class BinarySearchTree: |
| 16 | + def __init__(self) -> None: |
| 17 | + self._root_node: [None | TreeNode] = None |
| 18 | + |
| 19 | + def insert(self, value: int) -> None: |
| 20 | + if not self._root_node: |
| 21 | + self._root_node = TreeNode(value) # if the tree is empty, insert the new value |
| 22 | + else: |
| 23 | + self._insert_recursively(self._root_node, value) |
| 24 | + |
| 25 | + def _insert_recursively(self, root_node: TreeNode, value: int) -> None: |
| 26 | + if value < root_node.value: # insert on the left side of the root |
| 27 | + if not root_node.left_side: |
| 28 | + root_node.left_side = TreeNode(value) |
| 29 | + else: |
| 30 | + self._insert_recursively(root_node.left_side, value) |
| 31 | + else: # insert on the right side of the root |
| 32 | + if not root_node.right_side: |
| 33 | + root_node.right_side = TreeNode(value) |
| 34 | + else: |
| 35 | + self._insert_recursively(root_node.right_side, value) |
| 36 | + |
| 37 | + def search(self, search_number: int) -> bool: |
| 38 | + return self._search_recursively(self._root_node, search_number) if self._root_node else False |
| 39 | + |
| 40 | + def _search_recursively(self, root_node: [TreeNode | None], search_number: int) -> bool: |
| 41 | + if not root_node: # empty binary tree |
| 42 | + return False |
| 43 | + if root_node.value == search_number: |
| 44 | + return True |
| 45 | + elif search_number < root_node.value: # search on the left side of the root |
| 46 | + return self._search_recursively(root_node.left_side, search_number) |
| 47 | + else: # search on the right side of the root |
| 48 | + return self._search_recursively(root_node.right_side, search_number) |
| 49 | + |
| 50 | + |
| 51 | +if __name__ == "__main__": |
| 52 | + binary_search_tree = BinarySearchTree() |
| 53 | + input_search_number: int = Generator.generate_random_search_number() |
| 54 | + input_numbers: list = Generator.generate_input_array() |
| 55 | + |
| 56 | + for number in input_numbers: |
| 57 | + binary_search_tree.insert(number) |
| 58 | + |
| 59 | + print(60 * "-") |
| 60 | + print(f"Generated random input search number: {input_search_number}") |
| 61 | + print(f"Generated random input numbers: {input_numbers}") |
| 62 | + print(60 * "-") |
| 63 | + |
| 64 | + if binary_search_tree.search(input_search_number): |
| 65 | + print(f"The number: {input_search_number} exists in the Binary Search Tree.") |
| 66 | + else: |
| 67 | + print(f"The number: {input_search_number} does not exist in the Binary Search Tree.") |
| 68 | + print(60 * "-") |
0 commit comments