Scala: печать двоичного дерева - это класс - PullRequest
0 голосов
/ 18 февраля 2020

Здравствуйте, я новичок в 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, но Я получаю ошибки.

1 Ответ

1 голос
/ 19 февраля 2020
  • Если вы хотите удалить, чтобы удалить узлы на месте из дерева, вам понадобятся значения 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...