// Node.h #include template class node { public: node(size_t number, T t=0) : nodeNum_(number), value_(t), visited_(false) {} ~node() { // Can't delete children unless you are sure they were created on heap // for(size_t i=0; i* pNode) { children_.push_back(pNode); } bool& visited() { return visited_; } size_t size() { return children_.size(); } node* getNextUnmarkedChild() { for(size_t i=0; ivisited()) return children_[i]; return 0; } private: size_t nodeNum_; T value_; std::vector children_; bool visited_; }; template struct IFunc { virtual void operator()(node* pNode, int level)=0; }; template void DFS(node* pNode, IFunc& f) { static int lev = 1; pNode->visited() = true; f(pNode, lev++); for(size_t i=0; isize(); ++i) { node* pChild = pNode->getNextUnmarkedChild(); if(pChild) { DFS(pChild,f); } } --lev; }