- Если вы хотите удалить, чтобы удалить узлы на месте из дерева, вам понадобятся значения
var
. Я не был уверен, потому что replace
отсутствует в вашем фрагменте - Как отмечают комментарии,
Node
может занять только T
, пока вы не создадите фактическую TreeDemo
, поэтому во время определения класс, вы не можете создавать узлы определенных c типов, таких как Leaf(1)
et c. потому что это будет несовпадение типов. - Кажется, переменная типа должна быть на самом BinaryTree, поскольку вы хотите, чтобы ваша демонстрационная программа опробовала определенные c деревья, и она может быть ковариантной (
+T
) для разрешить для Empty
быть любым другим действительным BinaryTree. - Левое и правое деревья узла должны иметь те же типы, что и узел.
- Вы можете переопределить
toString
, чтобы обеспечить более информативную печать - Метод с именем
main
внутри класса не служит точкой входа. В Java только static void main
будет служить точкой входа в приложение. В Scala, main
также должен быть в состоянии c (в объекте вместо класса) для запуска.
sealed trait BinaryTree[+T]
case object Empty extends BinaryTree[Nothing]
class Node[T](var left:BinaryTree[T], var d:T, var right:BinaryTree[T])(implicit val ordering: Ordering[T]) extends BinaryTree[T] {
override def toString: String = (left, right) match {
case (Empty, Empty) => s"(${d})"
case (Empty, right) => s"(${left},${d})"
case (left, Empty) => s"(${d}, ${right})"
case _ => s"(${left}, ${d}, ${right})"
}
}
object Node{
// define remove here (if static) or in the class
def apply[T:Ordering](t: T) = new Node[T](Empty, t, Empty)
def apply[T:Ordering](left:BinaryTree[T], t: T) = new Node[T](left, t, Empty)
def apply[T:Ordering](left:BinaryTree[T], t: T, right:BinaryTree[T]) = new Node[T](left, t, right)
def apply[T:Ordering](t: T, right:BinaryTree[T]) = new Node[T](Empty, t, right)
}
// either extend App, or have a main method, but use an object
object TreeApp extends App {
val myTree = Node(Node(Node(1),2,Node(3)),4,Node(5))
println(myTree)
}