如果您要进行广度,则自然实现是将节点推入队列,而不是使用递归。 如果您正在进行深度搜索,那么递归是编码遍历的最自然方法。但是,除非您的编译器优化尾部递归中的迭代,否则您的递归实现将比迭代算法慢,并且会在足够深的树上死亡。 一些快速的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]
if len(c) > 1: 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)
递归的优势是表达的简单/优雅,而不是性能。 记住这是为给定算法,问题大小和机器体系结构选择适当方法的关键。
取决于您是要进行深度优先还是广度优先的遍历。深度优先是最容易通过递归实施的。首先,您需要保持一个节点的排队以在将来扩展。
实际上,您应该使用队列进行广度首次搜索和堆叠以进行深度首次搜索, 并从循环中运行您的算法。 如果您做简单 穿越时的操作,并可能导致堆栈溢出,但是这些天您会 需要非常努力地看到一个。仅在侧面有一个哈希,以跟踪已经访问过的节点,以防万一 一棵树,但连接良好的图。
带有递归,因为您实际上可能会遇到堆栈溢出错误,这是Stackoverflow.com,毕竟。