RosettaCodeData/Task/Tree-traversal/Scala/tree-traversal.scala

56 lines
1.4 KiB
Scala
Raw Permalink Normal View History

2015-02-20 00:35:01 -05:00
case class IntNode(value: Int, left: Option[IntNode] = None, right: Option[IntNode] = None) {
2013-04-11 01:07:29 -07:00
2015-02-20 00:35:01 -05:00
def preorder(f: IntNode => Unit) {
2013-04-11 01:07:29 -07:00
f(this)
2015-02-20 00:35:01 -05:00
left.map(_.preorder(f)) // Same as: if(left.isDefined) left.get.preorder(f)
2013-04-11 01:07:29 -07:00
right.map(_.preorder(f))
}
2015-02-20 00:35:01 -05:00
def postorder(f: IntNode => Unit) {
2013-04-11 01:07:29 -07:00
left.map(_.postorder(f))
right.map(_.postorder(f))
f(this)
}
2015-02-20 00:35:01 -05:00
def inorder(f: IntNode => Unit) {
2013-04-11 01:07:29 -07:00
left.map(_.inorder(f))
f(this)
right.map(_.inorder(f))
}
2015-02-20 00:35:01 -05:00
def levelorder(f: IntNode => Unit) {
2013-04-11 01:07:29 -07:00
def loVisit(ls: List[IntNode]): Unit = ls match {
case Nil => None
2015-02-20 00:35:01 -05:00
case node :: rest => f(node); loVisit(rest ++ node.left ++ node.right)
2013-04-11 01:07:29 -07:00
}
loVisit(List(this))
}
}
object TreeTraversal extends App {
implicit def intNode2SomeIntNode(n: IntNode) = Some[IntNode](n)
val tree = IntNode(1,
IntNode(2,
IntNode(4,
IntNode(7)),
IntNode(5)),
IntNode(3,
IntNode(6,
IntNode(8),
IntNode(9))))
List(
2015-02-20 00:35:01 -05:00
" preorder: " -> tree.preorder _, // `_` denotes the function value of type `IntNode => Unit` (returning nothing)
" inorder: " -> tree.inorder _,
" postorder: " -> tree.postorder _,
"levelorder: " -> tree.levelorder _) foreach {
2013-04-11 01:07:29 -07:00
case (name, func) =>
2015-02-20 00:35:01 -05:00
val s = new StringBuilder(name)
2013-04-11 01:07:29 -07:00
func(n => s ++= n.value.toString + " ")
println(s)
}
}