【发布时间】:2017-12-31 14:03:03
【问题描述】:
我在 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]
如果给定一个 Tree 实例,我想检查该实例是否平衡,其中平衡的定义是右侧元素的数量等于左侧的元素数量。
我尝试了以下方法(使用累加器模式)来得到我想要的:
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)
这陷入了一个无限循环,我很确定我的逻辑犯了一些愚蠢的错误。我对自己在哪里犯了错误并不自信。
【问题讨论】:
标签: scala binary-tree