Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
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 insert_node(?Node $root, int $value): Node { if ($root === null) return new Node($value); if ($value < $root->value) $root->left = insert_node($root->left, $value); else $root->right = insert_node($root->right, $value); return $root; }
$root = null;
foreach ([4, 2, 6, 1, 3, 5, 7] as $value) $root = insert_node($root, $value);
echo render_tree($root) . PHP_EOL;
?>
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
- Nodes are PHP objects from
class Nodewith typed properties:int $value,?Node $left, and?Node $right. - The constructor defaults both child links to
null, so a new leaf starts with no children. $rootstarts asnull, then each value in[4, 2, 6, 1, 3, 5, 7]is inserted with$root = insert_node($root, $value).insert_node(?Node $root, int $value): Nodereturns a node every time; the empty-subtree case createsnew Node($value).- The comparison is
$value < $root->value; smaller values recurse into$root->left, while equal-or-larger values use the right branch. - Child attachment is recursive assignment:
$root->left = insert_node(...)or$root->right = insert_node(...). - The trace builds
4, then4(2,_),4(2,6),4(2(1,3),6(5,_)), and finally4(2(1,3),6(5,7)). render_treeprints_for anullchild andvalue(left,right)for an internal node, soecho render_tree($root) . PHP_EOLprints4(2(1,3),6(5,7)).- The replay also includes the sorted insert contrast
[1, 2, 3, 4], which produces1(_,2(_,3(_,4)))with height4and no rotation step.
binary search tree
Values smaller than a node go left; larger values go right.