首先说写这个是因为在笔试某大厂的时候遇到了图的深度优先与广度优先遍历的问题,自己不是很懂,结束以后从新看了大话数据结构。
所谓图的遍历就是从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。
深度优先遍历:深度优先搜索(DFS)
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
深度优先遍历图的方法是,从图中某个顶点v出发:
- 访问顶点v;
- 依次从v的未被访问的邻接点出发,对图进行DFS;直至图中和v有路径相通的顶点都被访问;
- 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行DFS,直到图中所有顶点均被访问过为止。
深度优先遍历使用的数据结构是栈(Stack),将访问过的节点标记后,并压入栈中,再遍历此时跟栈顶元素相关联的节点,将其中未标记的节点标记,并压入栈中……以此类推,当该栈顶的元素相关联的节点都被访问过了,则该元素弹出栈……直到栈空,遍历完成。
广度优先遍历:广度优先搜索(BFS)
广度优先算法的核心思想是:从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。若没有,再用算符逐一扩展第二层的所有节点……,如此依次扩展,检查下去,直到发现目标节点为止。即
⒈从图中的某一顶点V0开始,先访问V0;
⒉访问所有与V0相邻接的顶点V1,V2,......,Vt;
⒊依次访问与V1,V2,......,Vt相邻接的所有未曾访问过的顶点;
⒋循此以往,直至所有的顶点都被访问过为止。
这种搜索的次序体现沿层次向横向扩展的趋势,所以称之为广度优先搜索。
讲解较为详细的,简单明了的链接如下:
基本算法——深度优先搜索(DFS)和广度优先搜索(BFS) - 简书 (jianshu.com)