I've written a Binary Search Tree Monad in Scala. I would like to hear your thoughts on how to improve it (e.g. making insertion/deletion/search faster and more scalable). Also, is there a better way to implement this kind of data structure the Scala way?
Here is the trait:
trait BST[+A] {
def +[B >: A <% Ordered[B]](elem: B): BST[B]
def ++[B >: A <% Ordered[B]](bst: BST[B]): BST[B]
def -[B >: A <% Ordered[B]](elem: B): (Option[B], BST[B])
def exists(p: A => Boolean): Boolean
def contains[B >: A <% Ordered[B]](e: B): Boolean
def filter[B >: A <% Ordered[B]](p: A => Boolean): BST[B] = filterAcc[B](EmptyBST)(p)
def filterAcc[B >: A <% Ordered[B]](acc: BST[B])(p: A => Boolean): BST[B]
def flatMap[B <% Ordered[B]](f: A => BST[B]): BST[B]
def map[B <% Ordered[B]](f: A => B): BST[B]
def inOrder[B](z: B)(f: (A, B) => B): B
def preOrder[B](z: B)(f: (A, B) => B): B
def postOrder[B](z: B)(f: (A, B) => B): B
def levelOrder[B](z: B)(f: (A, B) => B): B
def withLeft[B >: A <% Ordered[B]](newLeft: BST[B]): BST[B]
def withRight[B >: A <% Ordered[B]](newRight: BST[B]): BST[B]
def orElse[B >: A <% Ordered[B]](tree: BST[B]): BST[B]
def minChild[B >: A <% Ordered[B]]: BST[B] = minChildAcc[B](this)
def minChildAcc[B >: A <% Ordered[B]](acc: BST[B]): BST[B]
def toList = preOrder(List[A]())(_ :: _).reverse
}