BST = Struct.new(:data, :left, :right) do
  def insert(new_data)
    new_data > self.data ? input(:right, new_data) : input(:left, new_data)
  end

  def input(side, new_data)
    self[side] ? self[side].insert(new_data) : self[side] = BST.new(new_data)
  end

  def each(&block)
    self.left.each(&block) if self.left
    yield self.data
    self.right.each(&block) if self.right
  end
end