It sounds like you are looking for the iterator pattern. This should get you going in the right direction...
Do either a BFS or a DFS, and keep track of the path along with the node. When the node has no more children, dump the path. Note that you have a graph/forest instead of a tree, but the algorithm I outlined will work just the same.
To start you off using a BFS:
Step 1. [n1]
Step 2. [n2(n1), n3(n1)]
Step 3. [n3(n1), n4(n1,n2)]
Step 4. [n4(n1, n2), n4(n1, n3)]
Step 5. [n4(n1, n3), n5(n1, n2, n4), n6(n1, n2, n4), n10(n1, n2, n4)]
Step 6. [n5(n1, n2, n4), n6(n1, n2, n4), n10(n1, n2, n4), n5(n1, n3, n4), n6(n1, n3, n4), n10(n1, n3, n4)]
...
and so on. In the end you will have your paths. which will get printed out. You can implement this algorithm without requiring recursion. Just loop till the array is empty. Makes sense?
That's a graph, not a tree. http://en.wikipedia.org/wiki/Tree_structure
So... my pointer would be, you're looking for a solution in graph theory. If you get stuck, a bit of google-fu around that term and your problem should yield algorithms to implement.
You may find this wikipedia article helpful - it discusses the various kinds of tree traversal you can do. However, most likely what you want is a recursive descent, prefix traversal. Furthermore, the structure you describe is not a traditional tree - in that it has cross-shared nodes - it is probably a graph. There are some graph traversal algorithms as well. Just keep in mind, that if the graph has cycles, you will need to provide some kind of cycle detection to handle terminating the traversal.