Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
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 insert(root, value) if root == nil then return Node(value) end if value < root.value then root.left = insert(root.left, value) else root.right = insert(root.right, value) end return root end
local root = nil
for _, value in ipairs({4, 2, 6, 1, 3, 5, 7}) do root = insert(root, value) end
print(render(root))
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
Node(value, left, right)returns a Lua table withvalue,left, andrightfields.- Missing child fields are
nil, whichrender(node)prints as_. local root = nilstarts with an empty tree.- The insert order is the Lua table
{4, 2, 6, 1, 3, 5, 7}, traversed withipairs. insert(root, value)returns a newNode(value)when the current subtree isnil.- The comparison is
value < root.value; smaller values recurse intoroot.left, while equal-or-larger values recurse intoroot.right. - Child links are updated by assignment:
root.left = insert(root.left, value)orroot.right = insert(root.right, value). - The trace builds
4, then4(2,_),4(2,6),4(2(1,3),6(5,_)), and finally4(2(1,3),6(5,7)). print(render(root))outputs4(2(1,3),6(5,7)).- The replay also shows the sorted insert contrast
[1, 2, 3, 4], which forms1(_,2(_,3(_,4)))with height4and no rotation.
binary search tree
Values smaller than a node go left; larger values go right.