Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
Algorithm
The canonical tree is 4(2(1,3),6(5,7)), so this Ruby DSA
implementation can be compared directly with the rest of the DSA track.
binary search tree
Values smaller than a node go left; larger values go right.
Visual walkthrough
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.