Here is a general purpose tree traversal implementation that doesn't use recursion:
public static IEnumerable<T> Traverse<T>(T item, Func<T, IEnumerable<T>> childSelector)
{
var stack = new Stack<T>();
stack.Push(item);
while (stack.Any())
{
var next = stack.Pop();
yield return next;
foreach (var child in childSelector(next))
stack.Push(child);
}
}
In your case you can then call it like so:
IEnumerable<Node> allNodes = Traverse(pRoot, node => node.Children);
Use a Queue instead of a Stack for a breath first, rather than depth first, search. Use a PriorityQueue for a best first search.