在二叉树中没有为A定义隐式排序

时间:2019-07-02 16:11:35

标签: scala data-structures binary-tree generic-programming

我正在尝试在Scala中开发二叉树结构,但出现错误消息:

 Error:(15, 54) No implicit Ordering defined for A.

 override def add[A](new_value: A): BinaryTree[A] = new Node(NullNode,new_value,NullNode)

有人可以解释一下我该如何解决吗?这是代码,问题出在 NullNode 对象的 add 方法中,当您尝试为 Node创建左侧时会调用此方法

sealed abstract class BinaryTree[+A] {
  def isEmpty: Boolean
  def isValid: Boolean
  def add[B >: A](new_value: B): BinaryTree[A]
  def isLeaf: Boolean
  def length: Int
}

case object NullNode extends BinaryTree[Nothing] {
  override def isEmpty: Boolean = true
  override def isValid: Boolean = true
  override def isLeaf: Boolean = false
  override def add[A](new_value: A): BinaryTree[A] = new Node(NullNode,new_value,NullNode)
  override def length: Int = 0
}

case class Node[A] (
      var left  : BinaryTree[A],
      var value : A,
      var rigth : BinaryTree[A] )
    ( implicit ord: Ordering[A] ) extends BinaryTree[A] {
  override def isEmpty: Boolean = false
  override def isValid: Boolean = {
    import ord._

    def isValidWith (f: A => Boolean, t: BinaryTree[A]): Boolean = t match {
      case NullNode => true
      case Node(_,valueNode,_) => f(valueNode) && t.isValid
    }

    isValidWith(value < _, left) && isValidWith(value > _, rigth)
  }

  override def isLeaf: Boolean = left.isEmpty && rigth.isEmpty
  override def add[B >: A](new_value: B): BinaryTree[A] = {
    import ord._

    def travel (t: BinaryTree[A]): BinaryTree[A] = t match {
      case NullNode => t.add(new_value)
      case Node (left,nodeValor,rigth) => {
        if (new_value > nodeValor) new Node(travel(left),nodeValor,rigth)
        else if (new_value < nodeValor) new Node(left,nodeValor, travel(rigth))
        else throw new Exception("Valor ya introducido")
      }
    }

    travel(this)
  }
  override def length: Int = {
    def travel (t: BinaryTree[A]): Int = t match {
      case NullNode => t.length
      case Node(left,_,rigth) => left.length + rigth.length + 1
    }

    travel(this)
  }

}

object BinaryTree {
  def apply[A] (value: A)(implicit ord: Ordering[A]): BinaryTree[A] = new Node(NullNode,value,NullNode)
}

目前,我尝试了不同的实现,将 Ordering 添加到抽象类的通用类型中,或将抽象类设置为特征,但是我都没有想要的。如果有人能解释这个错误的原因,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

基本问题来自于以下事实:没有Ordering[Nothing]表示NullNode不能排序,但是Node.value类型必须是

我通过在每个Ordering方法引用中添加add()并调整value类型与left / right节点之间的关系来进行编译类型。

sealed abstract class BinaryTree[+A] {
  def isEmpty: Boolean
  def isValid: Boolean
  def add[B >: A :Ordering](new_value: B): BinaryTree[B]
  . . .

。 。

case object NullNode extends BinaryTree[Nothing] {
  override def isEmpty: Boolean = true
  override def isValid: Boolean = true
  override def isLeaf: Boolean = false
  override def add[A:Ordering](new_value: A): BinaryTree[A] =
    Node(NullNode, new_value, NullNode)
  . . .

。 。

case class Node[A,C<:A](left  : BinaryTree[C]
                       ,value : A
                       ,rigth : BinaryTree[C]
                       )(implicit ord: Ordering[A]) extends BinaryTree[A] { . . .

。 。

override def add[B >: A :Ordering](new_value: B): BinaryTree[B] = {
  import ord._

  def travel(t: BinaryTree[A]): BinaryTree[B] = t match { . . .

代码还存在其他问题,但至少可以编译。