Trees
BST Search
Search a binary search tree for one present and one absent value.
Algorithm
Basic Implementation
basic.R
node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)
render <- function(n) {
if (is.null(n)) return("_")
if (is.null(n$left) && is.null(n$right)) return(as.character(n$value))
paste0(n$value, "(", render(n$left), ",", render(n$right), ")")
}
sample_tree <- function() node(4, node(2, node(1), node(3)), node(6, node(5), node(7)))
list_string <- function(values) paste0("[", paste(values, collapse = ", "), "]")
search <- function(root, target) { n <- root; while (!is.null(n)) { if (target == n$value) return(TRUE); n <- if (target < n$value) n$left else n$right }; FALSE }
root <- sample_tree()
cat(if (search(root, 5)) "5 found" else "5 not found", "\n", sep = "")
cat(if (search(root, 8)) "8 found" else "8 not found", "\n", sep = "")
Complexity
- Time: O(h) per search
- Space: O(1) iterative
Implementation notes
sample_tree()builds the canonical list-node tree4(2(1,3),6(5,7)).- Each node is an R list with
value,left, andrightfields, read asn$value,n$left, andn$right. search <- function(root, target)is iterative. It starts withn <- rootand keeps looping while!is.null(n).- The loop checks
target == n$valuefirst. A match returnsTRUEimmediately. - Otherwise the cursor moves with
n <- if (target < n$value) n$left else n$right. - If the cursor falls off the tree to
NULL, the loop ends and the function returnsFALSE.
Replay steps
target 5: 4 -> right, 6 -> left, 5 -> match
target 8: 4 -> right, 6 -> right, 7 -> right, NULL -> not found
- Those cursor moves skip whole branches: searching for
5never visits the2(1,3)side, and searching for8only follows the right edge. - The two
cat(...)calls print exactly:
5 found
8 not found
search path
A comparison chooses one subtree at each step, so whole branches are skipped.