图的遍历 DFS和BFS

有图像帮助理解的算法都不是很难,如图,从0出发,进行深度优先遍历和广度优先遍历。
这个图和我做的题目可能不太符合,只是方便理解,真正输入的是这样的邻接矩阵

G = {'0': ['1', '2'],
     '1': ['2', '3'],
     '2': ['3', '5'],
     '3': ['4'],
     '4': [],
     '5': []}

图的遍历 DFS和BFS_第1张图片
深度优先遍历类似于树的先序遍历:

  1. 准备一个集合存放走过的顶点。
  2. 找出从0出发还没被访问过的邻接的顶点,访问该顶点。
  3. 重复2,直到没有未访问过的顶点为止
  4. 回溯到前一个顶点重复2,直到所有顶点均被访问,遍历完毕。
    广度优先遍历类似于树的层序遍历:
  5. 准备一个队列存放每一层的顶点
  6. 0入队列,0顶点的左孩子入队,右孩子入队,0出队列,这个过程就是遍历第一层
  7. 0的左孩子出队列,0的左孩子的左孩子入队,0的左孩子的右孩子入队,……
  8. 直到遍历完毕,队列中的状态类似下面的表
0 1 2
1 2 3
2 3 5
3 5 4
5 4
4
"""
用邻接矩阵来表示图
用nodes数组来存放顶点信息
用edge字典和list组合成邻接矩阵
"""

class Graph(object):
    def __init__(self):
        self.nodes = []
        self.edge = {
     }

    def insert(self, a, b=None):
        if a not in self.nodes:
            self.nodes.append(a)
            self.edge[a] = list()
        if b not in self.nodes and b is not None:
            self.nodes.append(b)
            self.edge[b] = list()
        if b is not None:
            self.edge[a].append(b)
            self.edge[b].append(a)

    def succ(self, a):
        return self.edge[a]

    def show_nodes(self):
        return self.nodes

    def show_edge(self):
        print(self.edge)


def dfs(G, s, S = None, explored = None):
    '''
    :param G: 图
    :param s: 当前节点
    :param S: 已经走过的节点
    :param explored: 寻找路径
    :return: res
    '''
    if S is None:
        # S用于存放已经走过的节点,用set()集合无序不重复刚好满足
        S = set()
    if explored is None:
        # res用于存放寻找路径,用list
        explored = []
    explored.append(s)
    S.add(s)
    for u in G[s]:
        if u in S:
            continue
        S.add(u)
        dfs(G, u, S, explored)

    return explored

def bfs(g, s):
    '''
    :param g:  图
    :param s:  开始的顶点
    :return:
    '''
    explored = []
    queue = [s]
    explored.append(s)
    while queue:
        v = queue.pop(0)
        for w in g[v]:
            if w not in explored:
                explored.append(w)
                queue.append(w)
    return explored

if __name__ == "__main__":
    graph = Graph()
    graph.insert('0', '1')
    graph.insert('0', '2')
    graph.insert('1', '2')
    graph.insert('1', '3')
    graph.insert('2', '3')
    graph.insert('2', '5')
    graph.insert('3', '4')
    graph.insert('4')
    graph.insert('5')
    # graph.show_edge()
    dfs = dfs(graph.edge, '0')
    print(dfs)
    bfs = bfs(graph.edge, '0')
    print(bfs)
['0', '1', '2', '3', '4', '5']
['0', '1', '2', '3', '5', '4']

你可能感兴趣的:(python,算法,数据结构,python,dfs,bfs)