深度优先搜索
2016-04-14 13:34
218 查看
深度优先搜索(Depth First Search)是一种遍历图中节点的策略,顾名思义,其核心思想是:只要可能,就在图中尽可能“深入”。具体来说,我们从图中一个节点出发(可以设这个节点为V1),按照某种策略寻找到V1的一条出发边,延出发边找到下一个节点(设为V2),再按照刚才的策略,找到v2的一条出发边,再去找新的节点。。。以此类推,直到不能再“深入”了(方便起见,我现在假设搜索到了节点Vn,上一个搜索到的节点为Vn-1),那么此时回溯到Vn-1,看Vn-1有没有其他的出发边,有的话,延新的出发边继续深搜,没有的话,向Vn-1的上一个节点回溯。
举个简单的例子吧,我们之前学过二叉树的遍历(其实,树,链表都可以看做是一种图的特殊形式,每一个节点都有值,有方向)。其中前序遍历,中序遍历,后序遍历三种常用的策略就是深搜,详见:点击打开链接,现在我们按照刚才对深搜的定义,再把这三种策略理解一下:
如下图所示,前序遍历的步骤:
![](http://img.blog.csdn.net/20160414135858962)
其中蓝色线条表示深入,红色线条表示回溯,这个搜索寻找出发边的的策略是先走左边,再走右边,因此,在A节点处时,先往B走,到了B,再往D走,到达D后,无法再深入了,因此回溯到B,发现还有到E的这条出发边没搜索,于是再往E,无路可走了,回溯至B,B也没有没搜寻的出发边了,再回溯至A...写程序时,一般深搜和递归就像孪生兄弟一样同时存在,三种遍历的代码之前我给出来过,可以点我刚才给出的链接回看,这里不再重复了。
可以看出,其实深搜是一种尽可能远离当前节点的策略,它找到一条出发边深入,而暂时对当前节点的其他出发边不予理会。相反,广度优先搜索则是尽可能多靠近当前节点,例如二叉树的层次遍历:ABCDEFG,这个以后会专门去谈。
当然,深搜并不是最近我要和大家讨论的,这个放到以后,和动态规划联系起来讲。这里只是让大家对三种遍历有个初步的认识,我们接下来几节会讲解如何不用递归解决二叉树的遍历问题,也是面试常考的内容。
举个简单的例子吧,我们之前学过二叉树的遍历(其实,树,链表都可以看做是一种图的特殊形式,每一个节点都有值,有方向)。其中前序遍历,中序遍历,后序遍历三种常用的策略就是深搜,详见:点击打开链接,现在我们按照刚才对深搜的定义,再把这三种策略理解一下:
如下图所示,前序遍历的步骤:
其中蓝色线条表示深入,红色线条表示回溯,这个搜索寻找出发边的的策略是先走左边,再走右边,因此,在A节点处时,先往B走,到了B,再往D走,到达D后,无法再深入了,因此回溯到B,发现还有到E的这条出发边没搜索,于是再往E,无路可走了,回溯至B,B也没有没搜寻的出发边了,再回溯至A...写程序时,一般深搜和递归就像孪生兄弟一样同时存在,三种遍历的代码之前我给出来过,可以点我刚才给出的链接回看,这里不再重复了。
可以看出,其实深搜是一种尽可能远离当前节点的策略,它找到一条出发边深入,而暂时对当前节点的其他出发边不予理会。相反,广度优先搜索则是尽可能多靠近当前节点,例如二叉树的层次遍历:ABCDEFG,这个以后会专门去谈。
当然,深搜并不是最近我要和大家讨论的,这个放到以后,和动态规划联系起来讲。这里只是让大家对三种遍历有个初步的认识,我们接下来几节会讲解如何不用递归解决二叉树的遍历问题,也是面试常考的内容。
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法