The problem is with the way you're passing your list pointers around. It would be simpler to use a std::list instead and pass it as a reference. Here's an example:
Code:
#include <iostream>
#include <list>
typedef std::list<int> LIST;
typedef LIST::const_iterator LIST_cit;
struct Tree {
int v;
Tree *left, *right;
Tree(int v_) : v(v_), left(0), right(0) { }
};
void traverse(Tree* d, LIST& lst) {
if (d) {
lst.push_back(d->v);
traverse(d->left, lst);
traverse(d->right, lst);
}
}
int main() {
Tree t(5);
t.left = new Tree(3);
t.right = new Tree(7);
t.left->right = new Tree(4);
t.right->left = new Tree(6);
LIST lst;
traverse(&t, lst);
for (LIST_cit i = lst.begin(); i != lst.end(); ++i)
std::cout << *i << "\n";
}