Advertisement
Guest User

Untitled

a guest
Dec 15th, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.15 KB | None | 0 0
  1. import ComparableWithOperator.comparable2operators
  2.  
  3. abstract class BST[T <: Comparable[T]] {
  4.  
  5.   val isBlack = true
  6.  
  7.   def value: T
  8.  
  9.   val left: BST[T]
  10.  
  11.   val right: BST[T]
  12.  
  13.   def add(x: T): BST[T]
  14.  
  15.   def in(x: T): Boolean
  16.  
  17.   def remove(x: T): BST[T]
  18.  
  19.   def isEmpty: Boolean
  20.  
  21.   def min: T
  22.  
  23.   def max: T
  24.  
  25.   def +(x: T) = add(x)
  26.  
  27.   def -(x: T) = remove(x)
  28.  
  29.   def ++(s: Seq[T]): BST[T] = s match {
  30.     case head :: tail => this + s.head ++ s.tail
  31.     case Nil => this
  32.   }
  33. }
  34.  
  35. class Node[T <: Comparable[T]](val value: T, override val left: BST[T] = new Nil[T], override val right: BST[T] = new Nil[T]) extends BST[T] {
  36.  
  37.  
  38.   override def add(x: T): BST[T] = {
  39.     if (x < value) new Node[T](value, left + x, right)
  40.     else if (x > value) new Node[T](value, left, right + x)
  41.     else this
  42.   }
  43.  
  44.   override def in(x: T): Boolean = {
  45.     if (x < value) left in x
  46.     else if (x > value) right in x
  47.     else true
  48.   }
  49.  
  50.   override def toString = "{" + left + value + right + "}"
  51.  
  52.   override def remove(x: T) = {
  53.     if (x < value) new Node(value, left.remove(x), right)
  54.     else if (x > value) new Node(value, left, right.remove(x))
  55.     else {
  56.       if (isLeaf) new Nil[T]
  57.       else if (right.isEmpty) left
  58.       else if (left.isEmpty) right
  59.       else {
  60.         val succ = right.min
  61.         new Node(succ, left, right.remove(succ))
  62.       }
  63.     }
  64.   }
  65.  
  66.   def isLeaf = left.isEmpty && right.isEmpty
  67.  
  68.   override def isEmpty: Boolean = false
  69.  
  70.   override def min: T = if (left.isEmpty) value else left.min
  71.  
  72.   override def max: T = if (right.isEmpty) value else right.max
  73. }
  74.  
  75. class Nil[T <: Comparable[T]] extends BST[T] {
  76.   override def add(x: T): BST[T] = new Node[T](x)
  77.  
  78.   override def in(x: T): Boolean = false
  79.  
  80.   override def toString = "."
  81.  
  82.   override def remove(x: T) = this
  83.  
  84.   override def isEmpty: Boolean = true
  85.  
  86.   override def min: T = throw new IllegalStateException("there is no min")
  87.  
  88.   override def max: T = throw new IllegalStateException("there is no min")
  89.  
  90.   override def value: T = throw new IllegalStateException("there is no value")
  91.   override val left: BST[T] = null
  92.   override val right: BST[T] = null
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement