:
class BinaryTree[T](
val item: T,
val left: Option[BinaryTree[T]] = None,
val right: Option[BinaryTree[T]] = None) {
override def toString() = "Tree(%s,%s,%s)".format(item,left,right)
}
class BinarySearchTree[T: Ordering](
override val item: T,
override val left: Option[BinarySearchTree[T]] = None,
override val right: Option[BinarySearchTree[T]] = None) extends BinaryTree[T](item, left, right) {
def insert(newval: T): BinarySearchTree[T] = {
val (newLeft, newRight) =
if (implicitly[Ordering[T]].lteq(newval, item))
(insertSubtree(newval, left), right)
else
(left, insertSubtree(newval, right))
new BinarySearchTree(item, newLeft, newRight)
}
private def insertSubtree(newval: T, subtree: Option[BinarySearchTree[T]]) =
Option(subtree
.map(_.insert(newval))
.getOrElse(new BinarySearchTree(newval, None, None)))
}
, , Scala -like:
- ,
val. insert , . () , . null Option. , left right Option[Binary(Search)Tree[T]], , .map , Option. insertSubtree : " , . , ".
:
scala> var t = new BinarySearchTree(5, None, None)
t: BinarySearchTree[Int] = Tree(5,None,None)
scala> t = t.insert(3)
t: BinarySearchTree[Int] = Tree(5,Some(Tree(3,None,None)),None)
scala> t = t.insert(4)
t: BinarySearchTree[Int] = Tree(5,Some(Tree(3,None,Some(Tree(4,None,None)))),None)
scala> t = t.insert(7)
t: BinarySearchTree[Int] = Tree(5,Some(Tree(3,None,Some(Tree(4,None,None)))),Some(Tree(7,None,None)))