Вы выполняете DFS (поиск / обход в глубину) прямо сейчас, используя рекурсию.
Сначала глубина , потому что рекурсия работает так же, как стек - вы обрабатываете дочерние элементытекущего узла, прежде чем обрабатывать следующий узел, поэтому сначала вы выбираете глубину вместо ширины.
Редактировать:
В ответ на ваш комментарий / обновленный вопрос:Ваш код будет обрабатываться последовательно элемент за элементом, параллельной обработки не будет, никакой «магии» не будет.Обход с использованием рекурсии эквивалентен использованию стека (LIFO = last in, first out) - он просто неявный.Таким образом, ваш метод также мог бы быть написан следующим образом, который производит тот же порядок обхода:
public void SomeMethod(TreeNode root)
{
Stack<TreeNode> nodeStack = new Stack<TreeNode>();
nodeStack.Push(root);
while (nodeStack.Count > 0)
{
TreeNode node = nodeStack.Pop();
//do something on item
//need to push children in reverse order, so first child is pushed last
foreach (TreeNode item in node.Nodes.Reverse())
nodeStack.Push(item);
}
}
Я надеюсь, что это прояснит происходящее - вам может быть полезно выписатьузлы на консоли, когда они обрабатываются или фактически шаг за шагом проходят отладчик.
(Также и рекурсивный метод, и метод, использующий стек, предполагают, что цикла нет, и не проверяют его- таким образом, предполагается, что это дерево, а не какой-либо граф. Для более поздней DFS введен флаг visited
, чтобы отметить уже увиденные узлы)