学习过程中发现这篇文章写得特别好,立转

深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。早在19世纪就被用于解决迷宫问题。

对于下面的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中优先选择左分枝)。 

DFS的实现方式相比于BFS应该说大同小异,只是把queue换成了stack而已,stack具有后进先出LIFO(Last Input First Output)的特性,DFS的操作步骤如下: 
1、把起始点放入stack; 
2、重复下述3步骤,直到stack为空为止:

  • 从stack中访问栈顶的点;
  • 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入stack中;
  • 如果此点没有尚未遍历的邻接点,则将此点从stack中弹出。

下面结合一个图(graph)的实例,说明DFS的工作过程和原理: 
(1)将起始节点1放入栈stack中,标记为已遍历。 

(2)从stack中访问栈顶的节点1,找出与节点1邻接的节点,有2,9两个节点,我们可以选择其中任何一个,选择规则可以人为设定,这里假设按照节点数字顺序由小到大选择,选中的是2,标记为已遍历,然后放入stack中。 

(3)从stack中取出栈顶的节点2,找出与节点2邻接的节点,有1,3,5三个节点,节点1已遍历过,排除;3,5中按照预定的规则选中的是3,标记为已遍历,然后放入stack中。 

(4)从stack中取出栈顶的节点3,找出与节点3邻接的节点,有2,4两个节点,节点2已遍历过,排除;选中的是节点4,标记为已遍历,然后放入stack中。 

(5)从stack中取出栈顶的节点4,找出与节点4邻接的节点,有3,5,6三个节点,节点3已遍历过,排除;选中的是节点5,标记为已遍历,然后放入stack中。 

(6)从stack中取出栈顶的节点5,找出与节点5邻接的节点,有2,4两个节点,节点2,4都已遍历过,因此节点5没有尚未遍历的邻接点,则将此点从stack中弹出。 

(7)当前stack栈顶的节点是4,找出与节点4邻接的节点,有3,5,6三个节点,节点3,5都已遍历过,排除;选中的是节点6,标记为已遍历,然后放入stack中。 

(8)当前stack栈顶的节点是6,找出与节点6邻接的节点,有4,7,8三个节点,4已遍历,按照规则选中的是7,标记为已遍历,然后放入stack中。 

(9)当前stack栈顶的节点是7,找出与节点7邻接的节点,只有节点6,已遍历过,因此没有尚未遍历的邻接点,将节点7从stack中弹出。 

(10)当前stack栈顶的节点是6,找出与节点6邻接的节点,有节点7,8,7已遍历过,因此将节点8放入stack中。 

(11)当前stack栈顶的节点是8,找出与节点8邻接的节点,有节点1,6,9,1,6已遍历过,因此将节点9放入stack中。 

(12)当前stack栈顶的节点是9,没有尚未遍历的邻接点,将节点9弹出,依次类推,栈中剩余节点8,6,4,3,2,1都没有尚未遍历的邻接点,都将弹出,最后栈为空。 
(13)DFS遍历完成。

深度优先搜索Or深度优先遍历详解相关推荐

  1. 图遍历详解(C语言版)

    文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...

  2. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

  3. 八数码深度优先搜索_深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...

  4. 深度优先搜索和深度优先搜索的区别

    一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...

  5. HubbleDotNet开源全文搜索数据库项目--技术详解

    HubbleDotNet开源全文搜索数据库项目--技术详解 HubbleDotNet 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene ...

  6. 蒙特卡洛树搜索(MCTS)详解

    蒙特卡洛树搜索(MCTS)详解 蒙特卡洛树搜索是一种经典的树搜索算法,名镇一时的 AlphaGo 的技术背景就是结合蒙特卡洛树搜索和深度策略价值网络,因此击败了当时的围棋世界冠军.它对于求解这种大规模 ...

  7. 深度优先搜索(DFS)与广度优先搜索(BFS)详解

    原文来自<挑战程序设计竞赛> 深度优先搜索(DFS)和宽度优先搜索(BFS)都是常见的搜索算法.在学习DFS和BFS之前,我们首先得知道递归函数的概念. 1. 递归函数 通俗地讲,一个函数 ...

  8. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  9. 【算法题】解数独-用深度优先搜索(DFS)算法解数独

    描述 输入一个数独棋盘,用0代表待填的空格 输出数独的一个解 示例 输入: 0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 ...

最新文章

  1. 客快物流大数据项目(四十六):Spark操作Kudu dataFrame操作kudu
  2. Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
  3. 铃铛计数问题——分块
  4. win10万能触摸屏驱动_教你win10系统设置usb鼠标驱动的方法
  5. 继刺甲蜂之后的飞鸽传书
  6. android模拟器登录用户,如何在模拟器上登录小米账号的游戏
  7. 爆肝三天,我整理了这份春招攻略【针对大三/研二】
  8. undo歌词中文音译_T-ara - Lovey Dovey 罗马拼音+中文歌词+韩文歌词+中文音译
  9. 台式机插耳机没反应没声音
  10. 2k的地址范围 计算机组成原理,计算机组成原理课后习题
  11. tesseract 识别图片应用一
  12. 怎么调用计算机任务管理器,如何使用任务管理器
  13. OBU ETC的汽车电子抛负载解决方案
  14. 浪潮服务器光驱安装操作系统,浪潮服务器安装
  15. XeLaTeX: 支持现代字体 LaTeX 编译器
  16. H.264视频编解码的FPGA源码分析(一)输入数据分析
  17. JZOJ3947. 【省常中JSOI模拟】收历史作业
  18. 从护士“逆袭”微软中国总裁,打工女皇消失20年后重出江湖回应2亿年薪传闻...
  19. Rockchip开发系列 - 3.1.GPIO IO引脚复用问题
  20. VGG16-猫狗分类-imagenet预训练模型

热门文章

  1. 最近在使用vue的时候,发现竟然不会引入图片,悲哀啊,于是乎。。。
  2. 以太猫游戏主合约(六)
  3. https://github.com/gnustep/
  4. 中小企业信贷风险补偿综合管理系统
  5. 2018年刑侦科推理试题php版,2018年刑侦科推理试题
  6. 多线程爬取wallhaven
  7. linux下打开windows txt文件中文乱码问题
  8. 手把手教你如何写作美赛论文
  9. 设置word表格行高
  10. SQL Server全外链接