什么是深度优先搜索?
还记得最先接触深度搜索的时候,还是在大一的课堂上,王老师为了向我们这群连门槛还没摸到的傻白甜炫一下技术,写了一个用深度优先搜索为思想核心的自动走迷宫小程序,当时引得大家一众欢呼。我内心也是一阵感叹:“难到这就是传说中的人工智能?这个程序的逻辑应该很麻烦吧”,后来才知道只是实现了一个很简单的深度优先搜索而已,说白了核心思想就是一条路走到底,走不下去了就回退,再判断有没有其他路可走,没了就再回退,直到走完所有的点为止
废话不多说,直接上图演示!!
我们还是遍历上次广度优先搜索的那张图
还是先访问a点,然后我们把a入栈(用栈来实现,主要是方便达到回退的效果)
栈内元素 | 栈顶元素 |
---|---|
a | a |
接着我们访问b点,b入栈
栈内元素 | 栈顶元素 |
---|---|
a,b | b |
继续访问b的邻节点,就来到了d,d入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,d | d |
接着访问d的邻节点,d已经没有能访问的邻节点,此时把d出栈
栈内元素 | 栈顶元素 |
---|---|
a,b | b |
继续访问没有访问过的b的邻节点,到了f,f入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f | f |
继续访问没有访问过的f的邻节点,到了h,h入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h | h |
下面就不写那么细了,到这里套路大家也懂了
到了g,g入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h,g | g |
到了c,c入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h,g,c | c |
到了e,e入栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h,g,c,e | e |
e没有能访问的点了,e出栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h,g,c | c |
c没有能访问的点了,c出栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h,g | g |
g没有能访问的点了,g出栈
栈内元素 | 栈顶元素 |
---|---|
a,b,f,h | h |
其实我们已经知道结果,没有未访问过的点了,会一直进行出栈操作
当最后一个节点a出栈,栈空了,我们就把能到达的点都遍历一遍了