fork(3) download
  1. sealed trait Tree[+A] {
  2. def +[B >: A <% Ordered[B]](x: B): Tree[B]
  3. }
  4.  
  5. case class Node[+A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A] {
  6. def +[B >: A <% Ordered[B]](x: B) =
  7. if (x <= value) Node(value, left + x, right)
  8. else Node(value, left, right + x)
  9.  
  10. override def toString =
  11. s"Tree(${value.toString}, ${left.toString}, ${right.toString})"
  12. }
  13.  
  14. case object End extends Tree[Nothing] {
  15. def +[B <% Ordered[B]](x: B) = Node(x)
  16.  
  17. override def toString = "."
  18. }
  19.  
  20. object Node {
  21. def apply[A](value: A): Node[A] = Node(value, End, End)
  22. }
  23.  
  24. object Tree {
  25. def apply[T <% Ordered[T]](l: List[T]): Tree[T] =
  26. l.foldLeft(End: Tree[T])((r, e) => r + e)
  27. }
  28.  
  29. object Main extends App {
  30. val list = List(9,2,1,4,7,11)
  31. val tree = Tree(list)
  32. println(tree)
  33. }
Success #stdin #stdout 0.38s 383040KB
stdin
Standard input is empty
stdout
Tree(9, Tree(2, Tree(1, ., .), Tree(4, ., Tree(7, ., .))), Tree(11, ., .))