Building the tree
Let's try building one such tree. The input values are fed from a List. Note that we are using Scala's immutable lists:
scala>   def buildTree[A](list: List[A]): BinTree[A] = list match { 
     |     case Nil => Leaf 
     |     case x :: xs => { 
     |       val k = xs.length / 2 
     |       Branch(x, buildTree(xs.take(k)), buildTree(xs.drop(k))) 
     |     } 
     |   } 
buildTree: [A](list: List[A])BinTree[A] 
 
val treeFromList = buildTree(list) 
treeFromList: BinTree[Int] = Branch(1,Branch(2,Branch(3,Leaf,Leaf),Branch(4,Leaf,Leaf)),Branch(5,Branch(6,Leaf,Leaf),Branch(7,Leaf,Branch(8,Leaf,Leaf)))) 
The method creates a balanced binary tree. Such a balanced tree's left and right subtrees have almost equal number of nodes.
The first case is simple:
case Nil => Leaf
The clause is hit when the list is empty. We just return a Leaf node in this case.
The second clause is as follows:
case x :: xs => { 
  val k = xs.length / 2 
  Branch(x, buildTree...