让我们看看一些 Scala 解决方案。首先,我将定义一个非常基本的二叉树:
case class Tree[+T](value: T, left: Option[Tree[T]], right: Option[Tree[T]])
我们将使用以下树:
1
/ \
2 3
/ / \
4 5 6
您像这样定义树:
val myTree = Tree(1,
Some(Tree(2,
Some(Tree(4, None, None)),
None
)
),
Some(Tree(3,
Some(Tree(5, None, None)),
Some(Tree(6, None, None))
)
)
)
我们将定义一个breadthFirst 函数,该函数将遍历树,将所需函数应用于每个元素。有了这个,我们将定义一个打印函数并像这样使用它:
def printTree(tree: Tree[Any]) =
breadthFirst(tree, (t: Tree[Any]) => println(t.value))
printTree(myTree)
现在,Scala 解决方案,递归,列出但没有队列:
def breadthFirst[T](t: Tree[T], f: Tree[T] => Unit): Unit = {
def traverse(trees: List[Tree[T]]): Unit = trees match {
case Nil => // do nothing
case _ =>
val children = for{tree <- trees
Some(child) <- List(tree.left, tree.right)}
yield child
trees map f
traverse(children)
}
traverse(List(t))
}
接下来,Scala解决方案,队列,无递归:
def breadthFirst[T](t: Tree[T], f: Tree[T] => Unit): Unit = {
import scala.collection.mutable.Queue
val queue = new Queue[Option[Tree[T]]]
import queue._
enqueue(Some(t))
while(!isEmpty)
dequeue match {
case Some(tree) =>
f(tree)
enqueue(tree.left)
enqueue(tree.right)
case None =>
}
}
该递归解决方案功能齐全,但我对它可以进一步简化感到不安。
队列版本不起作用,但非常有效。在 Scala 中关于导入对象的这一点并不常见,但在这里得到了很好的利用。