DFS工作程序和运行复杂性。
答案 0 :(得分:14)
深度优先搜索或DFS,因为它通常被称为图形/树遍历算法。
工作原理
考虑如下图所示的图表
现在让我们深入了解这些数字是如何出现的。
我们从起始节点开始并将其标记为已访问,然后我们将其添加到堆栈顶部。我们总是在堆栈顶部寻找元素的非访问邻居。
第一步后:
Stack = A
Output = A
Visited = A
现在我们有3个邻居A,如果没有提供选择它们的顺序,我们可以选择任何一个邻居。我们移动到B并将其推到堆栈的顶部并将其标记为已访问并添加到序列中。
Stack = A,B
Output = A,B
Visited = A,B
现在B再次只有两个邻居,所以我们移动到它的下一个邻居,将它移动到堆栈顶部,将其添加到序列中并将其标记为已访问。
Stack = A,B,D
Output = A,B,D
Visited = A,B,D
现在D没有邻居并且是叶子节点,所以我们从堆栈顶部弹出D。
Stack = A,B
Output = A,B,D
Visited = A,B,D
现在我们在堆栈的顶部有B,我们已经访问了D,所以我们移动到它的下一个邻居是F,所以我们将F添加到堆栈的顶部,将其标记为已访问并将其添加到序列
Stack = A,B,F
Output = A,B,D,F
Visited = A,B,D,F
现在F只有一个邻居,所以我们继续前进。我们按照节点E的相同程序给出
Stack = A,B,F,E
Output = A,B,D,F,E
Visited = A,B,D,F,E
现在,E的直接邻居节点是A,但我们已经访问过A并且没有从E到哪里,所以我们从堆栈的顶部弹出它。
Stack = A,B,F
Output = A,B,D,F,E
Visited = A,B,D,F,E
同样我们也访问了F的所有邻居,因此我们从堆栈顶部弹出F。
Stack = A,B
Output = A,B,D,F,E
Visited = A,B,D,F,E
我们没有从B遍历的路径,因此我们也从堆栈中弹出B
Stack = A
Output = A,B,D,F,E
Visited = A,B,D,F,E
现在A的下一个邻居是C,所以我们将C添加到堆栈的顶部并将其标记为已访问。
Stack = A,C
Output = A,B,D,F,E,C
Visited = A,B,D,F,E,C
G是我们节点C的直接邻居,因此我们将它添加到堆栈的顶部并将其标记为已访问
Stack = A,C,G
Output = A,B,D,F,E,C,G
Visited = A,B,D,F,E,C,G
由于G是叶子节点,我们没有路径,所以我们从堆栈中弹出它
Stack = A,C
Output = A,B,D,F,E,C,G
Visited = A,B,D,F,E,C,G
由于我们已经遍历了C的所有节点,我们也从堆栈中弹出
Stack = A
Output = A,B,D,F,E,C,G
Visited = A,B,D,F,E,C,G
A的下一个邻居是E,但我们已将其标记为已访问,因此我们没有来自A的路径,因此我们从堆栈中弹出A并且堆栈变空,从而为我们提供DFS序列。
Stack = null
Output = A,B,D,F,E,C,G
Visited = A,B,D,F,E,C,G
PS:对不起任何语法错误