对于图的遍历操作,一般有两种方法:深度优先遍历和广度优先遍历。
这里我们说的图的遍历是针对连通图而言的,即图中任意的两节点都有一条或多条路径能够相同。
深度优先: 顾名思义,一条路走到黑,选取一个图中的一个节点中作为起始结点,从起始结点开始,不听的访问该节点的下一个结点,直到访问到该节点没有下一个结点与其相连或者与其相连的结点都被访问过,则回退至上一步,看其上一个结点是否还有没被访问的结点,如果有,则继续按照深度优先访问,没有就继续回退,直到确认图中所有的结点都被访问到,则遍历结束。
由此,我们可以看出,在图的深度优先搜索过程中存在一个回溯过程,当访问到的结点没有与它相连的结点,或者与其相连的结点都被访问过时,就需要回溯到上一个结点。由于栈存在先进后出的特点,所以我们可以用栈来实现这个过程。
如果访问到该结点的邻接点未被访问,则将其第一个未被访问的结点添加入栈,直到没有或者所有邻接点都被访问过则进行出栈,没出栈一个元素,都要判断其是否还有未被访问的邻接点,直到栈中所有元素都出栈或者确认图中所有结点都被访问完,则搜索过程结束。
!!!注意:
以下只给出图的深度遍历和广度优先遍历方法,至于图的存储请参考本人博客:
图的三种存储方式(字典形式,邻接矩阵形式,邻接链表形式)
图的邻接表存储,深度优先遍历python实现:
def depth_order(start_node):
'''
基于图的邻接链表存储表示,图的深度优先遍历
:param start_node:
:return:
'''
n = int(input("请输入图中结点的个数:"))
# 实例化图对象
my_graph = graph()
# 创建结点
for i in range(0, n):
data = input("请输入结点:")
# 实例化图结点对象
data = graph_node(data)
# 将结点添加至图中
my_graph.add_node(data)
# print("图中所有顶点:")
for nn in my_graph.graph:
print(nn.data, end=