Вопрос 1: Если вы отметили + отметку перед пу sh, он использует меньше места, но меняет порядок посещения узлов. Вы посетите все, хотя.
Вопрос 2: Вы правы, что итеративная DFS обычно помещает все дочерние элементы узла в стек одновременно. Это увеличивает пространство, используемое для некоторых графиков, но не меняет наихудший случай использования пространства, и это самый простой способ, поэтому обычно нет причин менять это.
Иногда вы знаете что если вы этого не сделаете, это сэкономит много места, а затем вы сможете написать итеративную DFS, которая будет работать больше как рекурсивная. Вместо того, чтобы нажимать на следующие узлы для посещения в стеке, вы выбираете родителя * sh и позицию в его списке дочерних элементов или эквивалент, что в значительной степени то, что рекурсивная версия должна помнить, когда она повторяется. В псевдокоде это выглядит так:
func DFS(start):
let visited = EMPTY_SET
let stack = EMPTY_STACK
visited.add(start)
visit(start)
stack.push( (start,0) )
while(!stack.isEmpty()):
let (parent, pos) = stack.pop()
if (pos < parent.numChildren()):
let child = parent.child[pos]
stack.push(parent,pos+1)
if (!visited.contains(child)):
visited.add(child)
visit(child)
stack.push( (child,0) )
Вы можете видеть, что это немного сложнее, и записи, которые вы помещаете в стек sh, являются кортежами, что в некоторых случаях раздражает. Часто мы будем использовать два стека параллельно вместо создания кортежей для pu sh, или мы будем вставлять / извлекать две записи за раз, в зависимости от того, как должны быть представлены узлы и позиции дочернего списка.