python学习笔记(十) 栈与队模拟广度遍历与深度遍历

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")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值