Trees
BST Search
Search a binary search tree for one present and one absent value.
Algorithm
Basic Implementation
basic.php
<?php
class Node {
public int $value;
public ?Node $left;
public ?Node $right;
public function __construct(int $value, ?Node $left = null, ?Node $right = null) {
$this->value = $value; $this->left = $left; $this->right = $right;
}
}
function render_tree(?Node $node): string {
if ($node === null) return "_";
if ($node->left === null && $node->right === null) return (string)$node->value;
return $node->value . "(" . render_tree($node->left) . "," . render_tree($node->right) . ")";
}
function sample_tree(): Node {
return new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)));
}
function list_string(array $values): string { return "[" . implode(", ", $values) . "]"; }
function search_tree(?Node $root, int $target): bool { $node = $root; while ($node !== null) { if ($target === $node->value) return true; $node = $target < $node->value ? $node->left : $node->right; } return false; }
$root = sample_tree();
echo (search_tree($root, 5) ? "5 found" : "5 not found") . PHP_EOL;
echo (search_tree($root, 8) ? "8 found" : "8 not found") . PHP_EOL;
?>
Complexity
- Time: O(h) per search
- Space: O(1) iterative
Implementation notes
- Nodes are PHP objects from
class Nodewith typedint $valueplus nullable?Node $leftand?Node $rightlinks. sample_tree()constructs the checked tree directly as4(2(1,3),6(5,7)).search_tree(?Node $root, int $target): boolis iterative: it starts with$node = $rootand runs while$node !== null.- A strict match check,
$target === $node->value, returnstrueimmediately. - Otherwise the cursor moves with the ternary
$target < $node->value ? $node->left : $node->right. - The successful search target is
5: the trace moves from cursor4right, then cursor6left, then matches cursor5. - The miss target is
8: the trace moves from4right,6right,7right, then reachesnulland returnsfalse. - The search reads object links but does not mutate the tree.
- The two
echocalls format boolean results as text, printing5 foundand then8 not foundon the next line.
search path
A comparison chooses one subtree at each step, so whole branches are skipped.