Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
Algorithm
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 insert(root: Node, value: Int): Node = { if (root == null) return new Node(value); if (value < root.value) root.left = insert(root.left, value) else root.right = insert(root.right, value); root }
def main(args: Array[String]): Unit = { var root: Node = null; for (value <- List(4, 2, 6, 1, 3, 5, 7)) root = insert(root, value); println(render(root)) }
}
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
class Node(val value: Int, var left: Node = null, var right: Node = null)stores an immutable node value and mutable child references.- This source uses
nullfor empty child links rather thanOption[Node]. insert(root: Node, value: Int): Nodehandles an empty subtree first:if (root == null) return new Node(value).- For an existing node,
value < root.valuerecurses left and assignsroot.left = insert(root.left, value); otherwise it assignsroot.right = insert(root.right, value). - Equal values would follow the
elsebranch to the right, though the checked insert list has no duplicates. var root: Node = nullis reassigned after each call so the first inserted node becomes the tree root.- The trace inserts
4, 2, 6, 1, 3, 5, 7, showing paths like4 -> left -> 2 -> rightbefore reaching4(2(1,3),6(5,7)). - The replay also includes a sorted-order contrast:
[1, 2, 3, 4]forms1(_,2(_,3(_,4))), a height-4 chain with no rotation. render(node)prints_fornullchildren and nestedvalue(left,right), soprintln(render(root))outputs4(2(1,3),6(5,7)).
binary search tree
Values smaller than a node go left; larger values go right.