Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
Algorithm
Basic Implementation
basic.rb
class Node
attr_accessor :value, :left, :right
def initialize(value, left = nil, right = nil)
@value = value
@left = left
@right = right
end
end
def render(node)
return "_" if node.nil?
return node.value.to_s if node.left.nil? && node.right.nil?
"#{node.value}(#{render(node.left)},#{render(node.right)})"
end
def sample_tree
Node.new(4, Node.new(2, Node.new(1), Node.new(3)), Node.new(6, Node.new(5), Node.new(7)))
end
def insert(root, value); return Node.new(value) if root.nil?; value < root.value ? root.left = insert(root.left, value) : root.right = insert(root.right, value); root; end
root = nil
[4, 2, 6, 1, 3, 5, 7].each { |value| root = insert(root, value) }
puts render(root)
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
Nodeis a Ruby class withattr_accessor :value, :left, :right, so child links are mutable object fields.initialize(value, left = nil, right = nil)usesnilfor empty children; there is no sentinel node.insert(root, value)returnsNode.new(value)when the current subtree root isnil.- Otherwise it compares
value < root.valueand recursively assigns eitherroot.left = insert(root.left, value)orroot.right = insert(root.right, value). - Equal values would take the right-side branch because the code uses a ternary
with only the strict
<case on the left. - The top-level
root = insert(root, value)reassignment is what installs the first inserted node as the root. - The trace inserts
4, 2, 6, 1, 3, 5, 7, ending at4(2(1,3),6(5,7)). renderprintsnillinks as_and nested nodes asvalue(left,right).- The replay also includes sorted inserts
[1, 2, 3, 4], producing1(_,2(_,3(_,4)))with height4and O(n) unbalanced behavior.
binary search tree
Values smaller than a node go left; larger values go right.