|
16 | 16 | 8 3 1 6 4 7 10 14 13
|
17 | 17 | >>> print(" ".join(repr(i.value) for i in t.traversal_tree(postorder)))
|
18 | 18 | 1 4 7 6 3 13 14 10 8
|
| 19 | +>>> t.remove(20) |
| 20 | +Traceback (most recent call last): |
| 21 | + ... |
| 22 | +ValueError: Value 20 not found |
19 | 23 | >>> BinarySearchTree().search(6)
|
20 | 24 | Traceback (most recent call last):
|
21 | 25 | ...
|
@@ -173,22 +177,25 @@ def get_min(self, node: Node | None = None) -> Node | None:
|
173 | 177 | return node
|
174 | 178 |
|
175 | 179 | def remove(self, value: int) -> None:
|
176 |
| - node = self.search(value) # Look for the node with that label |
177 |
| - if node is not None: |
178 |
| - if node.left is None and node.right is None: # If it has no children |
179 |
| - self.__reassign_nodes(node, None) |
180 |
| - elif node.left is None: # Has only right children |
181 |
| - self.__reassign_nodes(node, node.right) |
182 |
| - elif node.right is None: # Has only left children |
183 |
| - self.__reassign_nodes(node, node.left) |
184 |
| - else: |
185 |
| - predecessor = self.get_max( |
186 |
| - node.left |
187 |
| - ) # Gets the max value of the left branch |
188 |
| - self.remove(predecessor.value) # type: ignore |
189 |
| - node.value = ( |
190 |
| - predecessor.value # type: ignore |
191 |
| - ) # Assigns the value to the node to delete and keep tree structure |
| 180 | + # Look for the node with that label |
| 181 | + node = self.search(value) |
| 182 | + if node is None: |
| 183 | + raise ValueError(f"Value {value} not found") |
| 184 | + |
| 185 | + if node.left is None and node.right is None: # If it has no children |
| 186 | + self.__reassign_nodes(node, None) |
| 187 | + elif node.left is None: # Has only right children |
| 188 | + self.__reassign_nodes(node, node.right) |
| 189 | + elif node.right is None: # Has only left children |
| 190 | + self.__reassign_nodes(node, node.left) |
| 191 | + else: |
| 192 | + predecessor = self.get_max( |
| 193 | + node.left |
| 194 | + ) # Gets the max value of the left branch |
| 195 | + self.remove(predecessor.value) # type: ignore |
| 196 | + node.value = ( |
| 197 | + predecessor.value # type: ignore |
| 198 | + ) # Assigns the value to the node to delete and keep tree structure |
192 | 199 |
|
193 | 200 | def preorder_traverse(self, node: Node | None) -> Iterable:
|
194 | 201 | if node is not None:
|
|
0 commit comments