def _get_helper(self, key, node: TreeNode) -> TreeNode: output = None if node.get_key() == key: output = node elif node.get_key() > key and node.get_left_child(): output = self._get_helper(key, node.get_left_child()) elif node.get_key() < key and node.get_right_child(): output = self._get_helper(key, node.get_right_child()) elif not node: raise KeyError return output
def _put_helper(self, key, value, node: TreeNode) -> None: if key < node.get_key(): if node.get_left_child(): self._put_helper(key, value, node.get_left_child()) else: node.set_left_child(TreeNode(key, value, parent=node)) elif key > node.get_key(): if node.get_right_child(): self._put_helper(key, value, node.get_right_child()) else: node.set_right_child(TreeNode(key, value, parent=node)) else: node.set_value(value)
def _remove(self, node_to_remove: TreeNode) -> None: if node_to_remove.is_leaf(): if node_to_remove.is_left_child(): node_to_remove.get_parent().set_left_child(None) else: node_to_remove.get_parent().set_right_child(None) node_to_remove.clear_connections() elif node_to_remove.has_only_one_child(): if node_to_remove.get_left_child(): self._remove_if_only_one_child(node_to_remove, node_to_remove.get_left_child) else: self._remove_if_only_one_child(node_to_remove, node_to_remove.get_right_child) else: successor = node_to_remove.get_successor() node_to_remove.set_key(successor.get_key()) node_to_remove.set_value(successor.get_value()) successor.remove_self()