Trees
BST Search
Search a binary search tree for one present and one absent value.
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 search(_ root: Node?, _ target: Int) -> Bool { var node = root; while let current = node { if target == current.value { return true }; node = target < current.value ? current.left : current.right }; return false }
let root = sampleTree()
print(search(root, 5) ? "5 found" : "5 not found")
print(search(root, 8) ? "8 found" : "8 not found")
Complexity
- Time: O(h) per search
- Space: O(1) iterative
Implementation notes
final class Nodegives the tree reference semantics; each node has alet value: Intand mutable optional child linksleft: Node?andright: Node?.sampleTree()builds the checked tree directly with nestedNode(...)calls:4(2(1,3),6(5,7)).search(_ root: Node?, _ target: Int) -> Boolis iterative. It starts withvar node = rootand useswhile let current = nodeto unwrap each cursor.- A match returns
trueimmediately. Otherwise the cursor moves withtarget < current.value ? current.left : current.right. - When the cursor becomes
nil, the loop ends and the function returnsfalse; there is no numeric sentinel in this source. - The trace for
5walks4 -> right,6 -> left, then matches at5. - The trace for
8walks4 -> right,6 -> right,7 -> right, then reachesnullfor the not-found result; this replay uses the balanced sample tree and does not include an imbalance contrast event. - The two
printcalls use ternary formatting, producing exactly5 foundand8 not foundon separate lines.
search path
A comparison chooses one subtree at each step, so whole branches are skipped.