Ich habe eine binäre Baumstruktur mit Fallklassen und Merkmalen in Scala definiert. Ich habe es so gemacht:Überprüfen Sie, ob ein Binärbaum in Scala ausgeglichen ist.
sealed trait Tree[+T]
case class Node[A](v: A, l: Tree[A], r: Tree[A]) extends Tree[A]
case class Leaf[A](v: A) extends Tree[A]
case object Empty extends Tree[Nothing]
Wenn ein Baum Beispiel gegeben, ich überprüfen möchten, ob die Instanz ausgeglichen ist, wo die Definition der Balance Anzahl der richtigen Elemente entspricht der Anzahl der Elemente auf der linken Seite.
Ich habe die folgende Methode versucht (der Akkumulator Muster verwendet wird) zu bekommen, was ich will:
sealed trait Tree[+T]
case class Node[A](v: A, l: Tree[A], r: Tree[A]) extends Tree[A]
case class Leaf[A](v: A) extends Tree[A]
case object Empty extends Tree[Nothing]
def isBalanced[A](tree: Tree[A]) = {
def inner(tree: Tree[A], acc: (Int, Int)): Boolean = tree match {
case n: Node[A] => inner(n.l, (acc._1 + 1, acc._2)) && inner(n.r, (acc._1, acc._2 + 1))
case l: Leaf[A] => inner(tree, acc)
case Empty => acc._1 == acc._2
}
inner(tree, (0, 0))
}
val node: Node[Int] = Node(1, Node(2, Leaf(3), Leaf(4)), Node(5, Leaf(6), Leaf(7)))
isBalanced[Int](node)
Diese läuft in einer Endlosschleife und ich bin mir ziemlich sicher, dass ich einige dumme Fehler mit meiner Logik gemacht . Ich bin nicht sicher, wo ich einen Fehler gemacht habe.