Veamos algunas soluciones Scala.En primer lugar, voy a definir un árbol binario muy básico:
case class Tree[+T](value: T, left: Option[Tree[T]], right: Option[Tree[T]])
Usaremos el siguiente árbol:
1
/\
2 3
//\
4 5 6
Se define el árbol de la siguiente manera:
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))
)
)
)
Hemos Definiremos una función breadthFirst que recorra el árbol aplicando la función deseada a cada elemento. Con esto, vamos a definir una función de impresión y utilizar de esta manera:
def printTree(tree: Tree[Any]) =
breadthFirst(tree, (t: Tree[Any]) => println(t.value))
printTree(myTree)
Ahora, la solución Scala, recursiva, listas, pero no hay colas:
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))
}
A continuación, la solución Scala, colas, sin recursividad:
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 =>
}
}
esa solución recursiva es completamente funcional, aunque no tengo la incómoda sensación de que puede ser aún más simplificado.
La versión de la cola no es funcional, pero es muy efectiva. El truco sobre la importación de un objeto es inusual en Scala, pero se le da un buen uso aquí.
Me sorprendería si alguien tenía una solución que era más fácil de leer que un BFS del árbol ... – Eric
http://en.wikipedia.org/wiki/Tree_traversal#Queue-based_level_order_traversal – CodeFusionMobile