Если вы выполняете поиск в ширину, естественная реализация заключается в том, чтобы помещать узлы в очередь, а не использовать рекурсию.
Если вы выполняете поиск в глубину, то рекурсия является наиболее естественным способом кодирования обхода. Однако, если ваш компилятор не оптимизирует хвостовую рекурсию в итерацию, ваша рекурсивная реализация будет медленнее, чем итерационный алгоритм, и умрет с переполнением стека на достаточно глубоком дереве.
Несколько быстрых Python, чтобы проиллюстрировать разницу:
#A tree is a tuple of an int and a tree.
t = (1, (2,(4, (6), (7, (9)) )), (3, (5, (8)) ))
def bfs(t):
to_visit = [t]
while len(to_visit) > 0:
c = to_visit[0]
if type(c) is int:
print c
else:
print c[0]
to_visit.append(c[1])
if len(c) > 2: to_visit.append(c[2])
to_visit = to_visit[1:]
def dfs(t):
if type(t) is int:
print t
return
print t[0]
dfs(t[1])
if len(t) > 2: dfs(t[2])
bfs(t)
dfs(t)