Я думаю, вам также нужно сложить глубины.Это то, что вы на самом деле сделали бы, если бы у вас была рекурсивная версия.Просто хранилище было бы «невидимым», поскольку вы бы использовали стек вызовов вместо явного стека, как вы делаете сейчас.
Если это поможет вам, вы можете легко преобразовать поиск в глубинук поиску в ширину, используя массив как очередь вместо стека.(Просто используйте removeFirstObject вместо removeLastObject.) Тогда вы будете знать, что вы всегда смотрите на узлы в порядке неубывающей глубины.Однако, если вам нужны точные глубины, я думаю, вам все равно нужно добавить некоторое хранилище для отслеживания того, когда вам нужно увеличить текущую глубину.
Обновление:
Вы должны быть в состоянии сделатьDFS без стека вообще, если вместо этого вы будете следовать родительским указателям узла для резервного копирования дерева.Это сделало бы поддержание глубины простым.Но вы должны быть осторожны, чтобы не нарушать сложность наихудшего случая с линейным временем, повторно сканируя детей, чтобы выяснить, где вы были.
Если у вас нет родительских указателей, то должна быть возможность достаточно сложитьинформация для отслеживания родителей.Но это будет означать, что вы помещаете в стек больше информации, чем делаете в настоящее время, так что это не будет большим улучшением по сравнению со стэкингом глубин напрямую.
Кстати, внимательно посмотрев на ваш алгоритм,Разве вы не смотрите на ту сторону массива, когда получаете следующий текущий узел?Это должно работать так:
push root
while stack not empty:
current = pop
push all children of current