深度优先搜索

来源:互联网 发布:苹果5蜂窝数据打不开 编辑:程序博客网 时间:2024/04/28 21:58

深度优先搜索(Depth First Search)是一种遍历图中节点的策略,顾名思义,其核心思想是:只要可能,就在图中尽可能“深入”。具体来说,我们从图中一个节点出发(可以设这个节点为V1),按照某种策略寻找到V1的一条出发边,延出发边找到下一个节点(设为V2),再按照刚才的策略,找到v2的一条出发边,再去找新的节点。。。以此类推,直到不能再“深入”了(方便起见,我现在假设搜索到了节点Vn,上一个搜索到的节点为Vn-1),那么此时回溯到Vn-1,看Vn-1有没有其他的出发边,有的话,延新的出发边继续深搜,没有的话,向Vn-1的上一个节点回溯。

举个简单的例子吧,我们之前学过二叉树的遍历(其实,树,链表都可以看做是一种图的特殊形式,每一个节点都有值,有方向)。其中前序遍历,中序遍历,后序遍历三种常用的策略就是深搜,详见:点击打开链接,现在我们按照刚才对深搜的定义,再把这三种策略理解一下:

如下图所示,前序遍历的步骤:


其中蓝色线条表示深入,红色线条表示回溯,这个搜索寻找出发边的的策略是先走左边,再走右边,因此,在A节点处时,先往B走,到了B,再往D走,到达D后,无法再深入了,因此回溯到B,发现还有到E的这条出发边没搜索,于是再往E,无路可走了,回溯至B,B也没有没搜寻的出发边了,再回溯至A...写程序时,一般深搜和递归就像孪生兄弟一样同时存在,三种遍历的代码之前我给出来过,可以点我刚才给出的链接回看,这里不再重复了。

可以看出,其实深搜是一种尽可能远离当前节点的策略,它找到一条出发边深入,而暂时对当前节点的其他出发边不予理会。相反,广度优先搜索则是尽可能多靠近当前节点,例如二叉树的层次遍历:ABCDEFG,这个以后会专门去谈。

当然,深搜并不是最近我要和大家讨论的,这个放到以后,和动态规划联系起来讲。这里只是让大家对三种遍历有个初步的认识,我们接下来几节会讲解如何不用递归解决二叉树的遍历问题,也是面试常考的内容。

0 1
原创粉丝点击