1、深度遍历:
假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。
图的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历。
设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新的顶点,继续遍历。
从A开始,使用深度遍历方法将整个图遍历。
1、A进栈;
2、A出栈,B,C进栈;
3、B出栈,D,E进栈;
4、D出栈,H,I进栈;
5、H,I出栈,E出栈;
6、C出栈,F,G进栈;
7、F出栈,
8、G出栈,J,K进栈;
9、J出栈,K出栈
栈模拟递归遍历目录(深度遍历):
import os
def getAllDirDE(path):
stack= []
stack.append(path)
#处理栈,当栈为空时结束循环
while len(stack) != 0:
#从栈中取出数据
dirPath = stack.pop()
fileslist = os.listdir(dirPath)
#处理每一个文件,如果是普通文件则打印处来,如果是目录则将该目录的地址压栈
for fileName in fileslist:
fileAbspath = os.path.join(dirPath,fileName)
if os.path.isdir(fileAbspath):
#是目录就压栈
print("目录:"+fileName)
stack.append(fileAbspath)
else:
#打印普通文件
print("普通文件"+fileName)
getAllDirDE(r"F:\untitled\menu")
2、广度遍历:
广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去。
基本思想是:
1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。
从A开始,使用广度遍历方法将整个图遍历。
1、A进队;
2、A出队,B,C进队;
3、C出队,F,G进队;
4、B出队,D,E进队;
5、G出队,J,K进队;
6、F出队;
7、E出队;
8、D出队,H,I进队;
9、K出队,
10、J出队;
11、I出队;
12、H出队
队模拟递归遍历目录(广度遍历):
import os
import collections
def getAllDirQU(path):
queue = collections.deque()
#进队
queue.append(path)
while len(queue) !=0:
#出队数据
dirPath = queue.popleft()
#找出所有文件
fileList = os.listdir(dirPath)
for fileName in fileList:
#绝对路径
fileAbspath = os.path.join(dirPath, fileName)
#判断是否目录,是就进队,不是打印
if os.path.isdir(fileAbspath):
print("目录:"+fileName)
queue.append(fileAbspath)
else:
print("普通文件:"+fileName)
getAllDirQU(r"F:\untitled\menu")