In case someone is interested by this refinement, it is possible to do a bit better, performance-wise, than Len's solution by threading an additional accumulator parameter.
The idea is to move from a function store : 'a btree -> 'a option list that takes a tree and produce a list to a function store' : 'a btree -> 'a option list -> 'a option list, that adds the element of the tree to an existing list passed as parameter.
let rec store' t acc = match t with
| L x -> Some x :: acc
| N (a, b) ->
store' a (store' b (None :: acc))
With this definition, elements are only added once in the final result list, instead of first being used to build a temporary store a list, then appended a second time to the final result through the (@) operator.
The parameter order is important because writing t before acc gives an intuition of the final element order in the list: the elements of t will be before the elements already present in acc. This allows the N case to read quite naturally: it is easy to see that the result will first have the elements of a, then b, then None, then acc.
Finally, you can of course define store in terms of store':
let store t = store' t []
It is customary to wrap the first definition inside the second one (if you don't want to expose this "lower-level" function to the users), and to give it the same name as the outer definition (which doesn't conflict as it is not recursive, so does not enter the inner scope):
let store t =
let rec store t acc = match t with
| L x -> Some x :: acc
| N (a, b) ->
store a (store b (None :: acc))
in store t []
Of course, whether this definition is "better" than Len's one depends on what your evaluation criterion are. Len's solution is shorter, easier to read, and maps the original problem more closely.
(You may get the best of both world by using lazy enumerations instead of strict lists, but that's yet another story.)