私はScalaのcaseクラスとtraitを使ってバイナリツリー構造を定義しました。ツリーインスタンス与えられ、私はバランスの定義は、右の要素の数が左に要素の数に等しいですインスタンスがバランスしているかどうかを確認したい場合はバイナリツリーがScalaでバランスが取れているかどうかチェック
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]
:私はこのようにそれを行っています。
私が欲しいものを得るために(アキュムレータパターンを使用して)以下の方法を試してみました:
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)
は、これは無期限ループに実行され、私は私のロジックにいくつかの愚かなミスを犯したことをかなり確信しています。私はどこでミスをしたのか主張していません。