迭代树走
问题内容:
自从我在大学学习 数据结构和算法 以来已经有一段时间了,所以最近令我惊讶的是,有人提出递归可能不是进行树遍历 的方式
(tm)。由于某种原因,基于队列的遍历并不是我一直使用的技术。
如果有的话,迭代遍历与递归遍历的优点是什么?在什么情况下我可以使用一种而不是另一种?
问题答案:
如果您要进行广度优先搜索,自然的实现是将节点推入队列,而不是使用递归。
如果要进行深度优先搜索,则递归是编码遍历的最自然的方法。但是,除非您的编译器将尾部递归优化到迭代中,否则递归实现将比迭代算法慢,并且将死于足够深的树上的堆栈溢出。
一些快速的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)