50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
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
|