Prefix Tree Traversal
Haskell, 125 bytes

t=tail.p
p=g.break(=='[')
g(a,(_:t))=(:)&amp;(map(a++).z)$t#[]
z[]=[""];z x=x
(']':u)#a=u:a
s#a=(#)&amp;(a++)$p s
(g&amp;f)(x:y)=g x$f y


The function is t (for traversal):

λ: t "cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"
["catsup","cats","cat","catcher","catches","catamaran","catacomb","catapult","catapulting"]
λ: t "[donut[][]cruller[]]"
["donut","","cruller"]
λ: t "[[[[[]]]]]"
[""]