Trees
BST Search
Search a binary search tree for one present and one absent value.
Algorithm
Basic Implementation
basic.kt
class Node(val value: Int, var left: Node? = null, var right: Node? = null)
fun render(node: Node?): String {
if (node == null) return "_"
if (node.left == null && node.right == null) return node.value.toString()
return "${node.value}(${render(node.left)},${render(node.right)})"
}
fun sampleTree() = Node(4, Node(2, Node(1), Node(3)), Node(6, Node(5), Node(7)))
fun listString(values: List<Int>) = values.joinToString(", ", "[", "]")
fun search(root: Node?, target: Int): Boolean { var node = root; while (node != null) { if (target == node.value) return true; node = if (target < node.value) node.left else node.right }; return false }
fun main() { val root = sampleTree(); println(if (search(root, 5)) "5 found" else "5 not found"); println(if (search(root, 8)) "8 found" else "8 not found") }
Complexity
- Time: O(h) per search
- Space: O(1) iterative
Implementation notes
- Kotlin represents nodes with
class Node(val value: Int, var left: Node? = null, var right: Node? = null), so child links are nullable references. sampleTree()allocates the fixed tree with nestedNode(...)calls and returns a non-null root formain.search(root: Node?, target: Int): Booleanis iterative. It starts withvar node = root, then loops while the nullable cursor is notnull.- A matching
target == node.valuereturnstrue; otherwisenodeis rebound tonode.leftwhentarget < node.value, ornode.rightfor larger values. - Falling out of the loop means the cursor reached
null, so the function returnsfalseinstead of using an exception or nullable result. - The trace searches
5by visiting4right,6left, then matching5. It searches8by visiting4,6, and7to the right before reachingnull. println(if (search(root, 5)) "5 found" else "5 not found")and the second call print5 foundand8 not found.
search path
A comparison chooses one subtree at each step, so whole branches are skipped.