''' 深度优先遍历: 是一种用于遍历树或者图的算法。沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都被搜索过了。搜索将回溯到节点v的那条边的起始节点。直到已发现从源节点可达的所有节点为止。如果还存在未发现的节点,则选择其中一个作为源节点并重复上述过程,整个进程反复进行直到所有节点都被访问为止. 广度优先遍历:从根节点开始,沿着树的宽度遍历树的节点,如果所有节点都被访问,则算法终止 ''' classGraph(object): def__init__(self, nodes, sides): # nodes表示用户输入的点,int型,sides表示用户输入的边,是一个二元组(u, v) # self.sequence是字典,key是点,value是与key相连的边 self.sequence = {} # self.side是临时变量,主要用于保存与 指定点v 相连接的点 self.side = [] for node in nodes: for side in sides: u, v = side if node == u: self.side.append(v) elif node == v: self.side.append(u) # 第二层主要是遍历属于这个点的所有边,然后将点和边组成字典 self.sequence[node] = self.side self.side = [] # print self.sequence # {1: [2, 3], 2: [1, 4, 5], 3: [1, 6, 7], 4: [2, 8], 5: [2, 8], 6: [3, 7], 7: [3, 6], 8: [4, 5]} defdfs(self, node0): # order里面存放的是具体的访问路径,已经遍历的了 queue, order = [], [] queue.append(node0) while queue: v = queue.pop() # 取出最后一个,为上一个刚加入节点的连接节点 order.append(v) # 深度优先先加入,注意这个order的加入顺序 for w in self.sequence[v]: # 两边 # 不在order表示没被遍历, if w notin order and w notin queue: queue.append(w) return order # bfs同理 defbfs(self, node0): queue, order = [], [] queue.append(node0) order.append(node0) while queue: v = queue.pop(0) # 层次遍历按迅速取出 for w in self.sequence[v]: # if w not in order and w not in queue: if w notin order order.append(w) # 没被遍历就直接将两边加入order queue.append(w) return order defmain(): nodes = [i+1for i in xrange(8)] sides = [(1, 2), (1, 3), (2, 4), (2, 5), (4, 8), (5, 8), (3, 6), (3, 7), (6, 7)] G = Graph(nodes, sides) print G.dfs(1) print G.bfs(1) if __name__ == '__main__': main()