Trees
Build a Binary Tree
Create a fixed seven-node binary tree and render its shape.
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.
node links
A node stores one value plus references to its left and right children.
Basic Implementation
basic.scala
Replay: real traced execution (multi-file project)
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 main(args: Array[String]): Unit = { println(render(sampleTree())) }
}
node ← 1, tree ← 1
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step1node1treenode ← 3, tree ← 1, 3
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step3node1, 3treenode ← 2, tree ← 2(1,3)
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step2node2(1,3)treenode ← 5, tree ← 2(1,3), 5
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step5node2(1,3), 5treenode ← 7, tree ← 2(1,3), 5, 7
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step7node2(1,3), 5, 7treenode ← 6, tree ← 2(1,3), 6(5,7)
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step6node2(1,3), 6(5,7)treenode ← 4, tree ← 4(2(1,3),6(5,7))
8}9def sampleTree(): Node = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)))10def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")values this step4node4(2(1,3),6(5,7))treestdout ← 4(2(1,3),6(5,7))
10 def listString(values: Seq[Int]): String = values.mkString("[", ", ", "]")11 def main(args: Array[String]): Unit = { println(render(sampleTree())) }12}values this step4(2(1,3),6(5,7))stdout4(2(1,3),6(5,7))tree
Complexity
- Time: O(n)
- Space: O(n)
Implementation notes
class Node(val value: Int, var left: Node = null, var right: Node = null)uses an immutableIntvalue with mutable child references.- Empty children are represented with
nulldefaults, notOption[Node]. sampleTree()builds the whole tree with nested constructors:new Node(4, new Node(2, ...), new Node(6, ...)).- There are no later child assignments in this lesson; the left and right links are wired as constructor arguments.
- The trace shows the construction visually from children upward:
1,3, then2(1,3), followed by5,7, then6(5,7), and finally the root4(2(1,3),6(5,7)). render(node)treatsnullas_, prints leaf nodes as just their value, and prints internal nodes asvalue(left,right).maincallsprintln(render(sampleTree())), so the checked output is the compact tree string4(2(1,3),6(5,7)).