То, что вы делаете, по сути является DFS дерева. Вы можете устранить рекурсию, используя стек:
traverse(Node node) {
if (node==NULL)
return;
stack<Node> stk;
stk.push(node);
while (!stk.empty()) {
Node top = stk.pop();
for (Node child in top.getChildren()) {
stk.push(child);
}
process(top);
}
}
Если вы хотите, чтобы BFS использовала очередь:
traverse(Node node) {
if (node==NULL)
return;
queue<Node> que;
que.addRear(node);
while (!que.empty()) {
Node front = que.deleteFront();
for (Node child in front.getChildren()) {
que.addRear(child);
}
process(front);
}
}
В случае, если вам нужен другой способ обхода, вам придется следовать тому же подходу, хотя и с другой структурой данных для хранения узла. Может быть приоритетная очередь (если вы хотите оценить функцию на каждом узле, а затем обработать узлы на основе этого значения).