Scala:打印一个二叉树';这是一门课

Scala:打印一个二叉树';这是一门课,scala,Scala,您好,我是Scala新手,我很难让我的类打印出一些值 class TreeDemo[T](implicit o : T => Ordered[T]) { sealed trait BinaryTree case object Empty extends BinaryTree case class Node(left:BinaryTree, d:T, right:BinaryTree) extends BinaryTree // cons

您好,我是Scala新手,我很难让我的类打印出一些值

class TreeDemo[T](implicit o : T => Ordered[T]) {

      sealed trait BinaryTree
      case object Empty extends BinaryTree
      case class Node(left:BinaryTree, d:T, right:BinaryTree) extends BinaryTree


      // construct a "leaf" node
      def Leaf(d : T) : BinaryTree = Node(Empty,d,Empty)

      // remove all nodes equal to x from tree t
      def remove(t : BinaryTree, x : T) : BinaryTree = {
        replace(t, x, Empty)
      }

      val myTree = Node(Node(Leaf(1),2,Leaf(3)),4,Leaf(5))
      val x = remove(myTree, 2)

      def main (args: Array[String]) {
       println(x)
      }
}
从上面的代码,我试图打印删除def,但我得到了错误

  • 如果要从树中就地删除节点,则需要
    var
    值。我不确定,因为您的代码段中缺少
    replace
  • 正如注释所指出的,
    节点
    只能在实例化实际的
    树形图之前使用
    T
    ,因此在定义类时,不能创建特定类型的节点,例如
    Leaf(1)
    等,因为这将是一种类型不匹配
  • 类型变量似乎应该在BinaryTree本身上,因为您希望您的演示程序尝试特定的树,并且它可以是协变的(
    +T
    ),以允许
    空的
    成为任何其他有效的BinaryTree。
    • 节点的左树和右树应具有与节点相同的类型
  • 您可以覆盖
    toString
    ,以允许更多信息的打印
  • 类内部名为
    main
    的方法不作为入口点。在Java中,只有
    静态void main
    将用作应用程序入口点。在Scala中,
    main
    也应该是静态的(在对象而不是类中)才能运行
sealed trait二进制树[+T]
case对象为空扩展二进制树[无]
类节点[T](变量左:BinaryTree[T],变量d:T,变量右:BinaryTree[T])(隐式变量排序:排序[T])扩展了BinaryTree[T]{
重写def toString:String=(左、右)匹配{
大小写(空,空)=>s“(${d})”
大小写(空,右)=>s“(${left},${d})”
大小写(左,空)=>s“(${d},${right})”
大小写为“(${left},${d},${right})”
}
}
对象节点{
//在此处(如果是静态的)或类中定义remove
def apply[T:Ordering](T:T)=新节点[T](空,T,空)
def apply[T:Ordering](左:二进制树[T],T:T)=新节点[T](左,T,空)
def apply[T:Ordering](左:二进制树[T],T:T,右:二进制树[T])=新节点[T](左,T,右)
def apply[T:Ordering](T:T,right:BinaryTree[T])=新节点[T](空,T,right)
}
//扩展应用程序,或使用main方法,但使用对象
对象树扩展应用程序{
val myTree=节点(节点(节点(1)、2、节点(3))、4、节点(5))
println(myTree)
}

请定义
,但我收到错误
remove()
未在发布的代码中定义。类
TreeDemo
接收类型参数
T
,因此它是在类的外部定义的,因此您不能在类定义的内部创建
叶(1)
(其中
T
Int
)。