Advertisement
Guest User

Untitled

a guest
Jun 13th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.91 KB | None | 0 0
  1. import scala.annotation.tailrec
  2.  
  3.  
  4. abstract class BST[T]{
  5.     def _doprint(tier:Int)
  6. };
  7. case class Branch[T](root:T,lst:BST[T],rst:BST[T]) extends BST[T] {
  8.     def indent(tier:Int):String = {
  9.         @tailrec def spaces (rem : Int, acc : String):String = {
  10.             rem match{
  11.                 case 0 => acc
  12.                 case _ => spaces(rem-1, acc+" ")
  13.             }
  14.         }
  15.         spaces(tier,"")
  16.     }
  17.     override def _doprint(tier:Int) = {
  18.         print(indent(tier)) ;
  19.         lst match{
  20.             case Empty() =>
  21.                 rst match{
  22.                     case Empty() => print("|") ; println(root)
  23.                     case _ => print("\\") ; println(root) ; rst._doprint(tier+1)
  24.                 }
  25.             case _ => print("\\") ; println(root) ; lst._doprint(tier+1) ; rst._doprint(tier+1)
  26.         }
  27.     }
  28. };
  29. case class Empty[T] () extends BST[T] {
  30.     override def _doprint(tier:Int) = {
  31.         println("[]")
  32.     }
  33. };
  34.  
  35. object BSTOps {
  36.     def newEmptyBST[T]():Empty[T] = {
  37.         Empty[T]()
  38.     };
  39.     def newBSTFromLeaf[T](lf:T):Branch[T] = {
  40.         Branch[T](lf,newEmptyBST(),newEmptyBST())
  41.     };
  42.     def newBSTFromSubBSTs[T](root:T,lst:BST[T],rst:BST[T]):Branch[T] = {
  43.         Branch(root,lst,rst)
  44.     };
  45.     def printBST[T](t:BST[T]) = {
  46.         t._doprint(0)
  47.     };
  48.     def foldl[T,ACC](fun : (T, ACC) => ACC, acc: ACC, t:BST[T]):ACC = {
  49.         t match {
  50.             case Empty() => acc
  51.             case Branch(r,lst,rst) =>
  52.                 foldl(
  53.                     fun,
  54.                     foldl(
  55.                         fun,
  56.                         fun(r,acc),
  57.                         lst
  58.                     ),
  59.                     rst
  60.                 )
  61.         }
  62.     };
  63.     def exampleTree():BST[Int] = {
  64.         val bstOps = BSTOps
  65.         bstOps.newBSTFromSubBSTs(
  66.             1,
  67.             bstOps.newEmptyBST[Int](),
  68.             bstOps.newBSTFromSubBSTs(
  69.                 2,
  70.                 bstOps.newBSTFromSubBSTs(
  71.                     3,
  72.                     bstOps.newEmptyBST[Int](),
  73.                     bstOps.newEmptyBST[Int]()
  74.                 ),
  75.                 bstOps.newBSTFromSubBSTs(
  76.                     4,
  77.                     bstOps.newEmptyBST[Int](),
  78.                     bstOps.newEmptyBST[Int]()
  79.                 )
  80.             )
  81.         )
  82.     };
  83. };
  84.  
  85. object Main extends App {
  86.     val bstOps = BSTOps
  87.     bstOps.printBST(bstOps.exampleTree())
  88.     println("sum="+bstOps.foldl[Int,Int]((a:Int,b:Int)=>a+b,0,bstOps.exampleTree()))
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement