Trees
BST Search
Search a binary search tree for one present and one absent value.
Algorithm
Basic Implementation
basic.lua
local function Node(value, left, right)
return { value = value, left = left, right = right }
end
local function render(node)
if node == nil then return "_" end
if node.left == nil and node.right == nil then return tostring(node.value) end
return tostring(node.value) .. "(" .. render(node.left) .. "," .. render(node.right) .. ")"
end
local function sample_tree()
return Node(4, Node(2, Node(1), Node(3)), Node(6, Node(5), Node(7)))
end
local function list_string(values)
return "[" .. table.concat(values, ", ") .. "]"
end
local function search(root, target) local node = root; while node ~= nil do if target == node.value then return true end if target < node.value then node = node.left else node = node.right end end return false end
local root = sample_tree()
print(search(root, 5) and "5 found" or "5 not found")
print(search(root, 8) and "8 found" or "8 not found")
Complexity
- Time: O(h) per search
- Space: O(1) iterative
Implementation notes
Node(value, left, right)returns a Lua table withvalue,left, andrightfields.- Missing child fields are
nil, andsample_tree()builds4(2(1,3),6(5,7)). search(root, target)is iterative: it starts withlocal node = rootand loops whilenode ~= nil.- A match uses
if target == node.value then return true end. - Otherwise,
target < node.valuemoves the cursor tonode.left; larger targets move tonode.right. - If the cursor reaches
nil, the function returnsfalse. - The successful target is
5: the trace moves from cursor4right, then from6left, then matches5. - The missing target is
8: the trace moves right from4, right from6, right from7, then reachesnil. - The output uses Lua's
and/orexpression to choose strings, printing5 foundand8 not found.
search path
A comparison chooses one subtree at each step, so whole branches are skipped.