Consider the following extension method in c#, Traverse:
IEnumerable Traverse( this IEnumerable source,
Well I don't think you can avoid searching the tree until you find the node you're looking for without storing a parent pointer.
You'll start from the root. Test the current node for a match. If it is a match, return the node or just the name (as a list of this one element). Otherwise, if this is a leaf node, return null. If not a leaf, traverse it's children and if the children return non-null value, prepend the current node to your list and return that.
Returning from the original call, null means no match found. Otherwise you'll have your list of nodes in order.