from typing import Optional from trees import Node type BinarySearchTree[T] = Optional[Node[T]] def insert[T](node: BinarySearchTree[T], value: T) -> BinarySearchTree[T]: prev = None curr = node while curr: prev = curr if curr.value > value: curr = curr.left else: curr = curr.right if prev is None: return Node(value, None, None) elif value < prev.value: prev.left = Node(value, None, None) else: prev.right = Node(value, None, None) return node def exists[T](node: Optional[Node[T]], value: T) -> bool: return node and (exists(node.left, value) if value < node.value else (value == node.value or exists(node.right, value))) def remove[T](node: BinarySearchTree[T], value: T) -> BinarySearchTree[T]: if node is None: return node if value < node.value: node.left = remove(node.left, value) return node if value > node.value: node.right = remove(node.right, value) return node if node.right is None: return node.left if node.left is None: return node.right min_node = node.right while min_node.left: min_node = min_node.left node.value = min_node.value node.right = remove(node.right, min_node.value) return node