一尘不染

迭代树走

algorithm

自从我在大学学习 数据结构和算法 以来已经有一段时间了,所以最近令我惊讶的是,有人提出递归可能不是进行树遍历 的方式
(tm)。由于某种原因,基于队列的遍历并不是我一直使用的技术。

如果有的话,迭代遍历与递归遍历的优点是什么?在什么情况下我可以使用一种而不是另一种?


阅读 286

收藏
2020-07-28

共1个答案

一尘不染

如果您要进行广度优先搜索,自然的实现是将节点推入队列,而不是使用递归。

如果要进行深度优先搜索,则递归是编码遍历的最自然的方法。但是,除非您的编译器将尾部递归优化到迭代中,否则递归实现将比迭代算法慢,并且将死于足够深的树上的堆栈溢出。

一些快速的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)
2020-07-28