Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
Algorithm
Basic Implementation
basic.swift
final class Node {
let value: Int
var left: Node?
var right: Node?
init(_ value: Int, _ left: Node? = nil, _ right: Node? = nil) { self.value = value; self.left = left; self.right = right }
}
func render(_ node: Node?) -> String {
guard let node = node else { return "_" }
if node.left == nil && node.right == nil { return String(node.value) }
return "\(node.value)(\(render(node.left)),\(render(node.right)))"
}
func sampleTree() -> Node {
return Node(4, Node(2, Node(1), Node(3)), Node(6, Node(5), Node(7)))
}
func listString(_ values: [Int]) -> String { return "[" + values.map(String.init).joined(separator: ", ") + "]" }
func insert(_ root: Node?, _ value: Int) -> Node { guard let root = root else { return Node(value) }; if value < root.value { root.left = insert(root.left, value) } else { root.right = insert(root.right, value) }; return root }
var root: Node? = nil
for value in [4, 2, 6, 1, 3, 5, 7] { root = insert(root, value) }
print(render(root))
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
final class Nodegives each tree node reference semantics;valueis alet Int, whileleftandrightare mutableNode?child references.init(_ value: Int, _ left: Node? = nil, _ right: Node? = nil)defaults new child links tonil.insert(_ root: Node?, _ value: Int) -> Nodehandles an empty subtree withguard let root = root else { return Node(value) }.- Recursive insertion mutates child references in place:
root.left = insert(root.left, value)forvalue < root.value, otherwiseroot.right = insert(root.right, value). - Equal values would follow the
elsebranch to the right; the checked input has no duplicates. var root: Node? = nilis reassigned after each insertion so the first returned node becomes the tree root.- The trace records insertion paths for
4, 2, 6, 1, 3, 5, 7, ending at4(2(1,3),6(5,7)); the adversarial contrast shows sorted inserts[1, 2, 3, 4]forming1(_,2(_,3(_,4)))with height4. render(_:)prints_fornilchildren and nested node text, soprint(render(root))outputs4(2(1,3),6(5,7)).
binary search tree
Values smaller than a node go left; larger values go right.