Trees
Preorder Traversal
Visit the root before each subtree, producing root-left-right order.
Algorithm
The canonical tree is 4(2(1,3),6(5,7)), so this Scala DSA
implementation can be compared directly with the rest of the DSA track.
Basic Implementation
basic.scala
import scala.collection.mutable.{ArrayBuffer, Queue}
class Node(val value: Int, var left: Node = null, var right: Node = null)
object Main {
def render(node: Node): String = {
if (node == null) "_"
else if (node.left == null && node.right == null) node.value.toString
else s"${node.value}(${render(node.left)},${render(node.right)})"
}
def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))
def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")
def preorder(node: Node, output: ArrayBuffer[Int]): Unit = { if (node == null) return; output += node.value; preorder(node.left, output); preorder(node.right, output) }
def main(args: Array[String]): Unit = { val output = ArrayBuffer.empty[Int]; preorder(sampleTree(), output); println(listString(output)) }
}
Complexity
- Time: O(n)
- Space: O(h) recursion stack
Implementation notes
- Render tree structure explicitly instead of printing node objects.
- The replay highlights the node, traversal state, queue, path, or search cursor that changes at each step.
preorder
Preorder records the current node before visiting left and right subtrees.