45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
from typing import Iterator, Optional
|
|
from trees import Node, traverse
|
|
from dataclasses import InitVar, dataclass
|
|
|
|
@dataclass
|
|
class BinarySearchTree[T]:
|
|
|
|
def __post_init__(self):
|
|
self.__root: Optional[Node[T]] = None
|
|
|
|
|
|
def insert(self, value: T):
|
|
prev = None
|
|
curr = self.__root
|
|
while curr:
|
|
prev = curr
|
|
if curr.value > value:
|
|
curr = curr.left
|
|
else:
|
|
curr = curr.right
|
|
if prev is None:
|
|
self.__root = Node(value, None, None)
|
|
elif value < prev.value:
|
|
prev.left = Node(value, None, None)
|
|
else:
|
|
prev.right = Node(value, None, None)
|
|
|
|
def __delete(prev: Node[T], to_delete: Node[T]) -> Node[T]:
|
|
# TODO: implement
|
|
pass
|
|
|
|
def remove(self, value: T):
|
|
prev = None
|
|
curr = self.__root
|
|
while curr:
|
|
prev = curr
|
|
if curr.value > value:
|
|
curr = curr.left
|
|
elif curr.value < value:
|
|
curr = curr.right
|
|
else:
|
|
curr = self.__delete(prev, curr)
|
|
|
|
def __iter__(self) -> Iterator[T]:
|
|
yield from traverse(self.__root) |