数据结构-图

文章目录

  • 1、概念
    • 1.1 图
  • 2、图的存储
    • 2.1 邻接矩阵
    • 2.2 邻接表
  • 3、图的遍历
    • 3.1 基本思路
    • 3.2 广度优先遍历BFS
    • 3.3 深度优先遍历DFS
  • 参考

1、概念

1.1 图

(Graph)是由顶点的集合和顶点之间边的集合组成,通常表示为:
G ( V , E ) G(V,E) GVE
其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中的数据元素,我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的

2、图的存储

2.1 邻接矩阵

2.2 邻接表

3、图的遍历

3.1 基本思路

从图中某一个顶点出发遍历途中其余顶点,每一个顶点仅被访问一次

(1)树有四种遍历方式,因为根节点只有一个。而图的复杂情况是的顺着一个点向下寻找,极有可能最后又找到自己,形成回路导致死循环。
(2)所以要设置一个数组voisited[n],n是图中顶点个数,初值为0,当该顶点被遍历后,修改数组元素的值为1
(3)基于此,形成了2种遍历方案:深度优先遍历和广度优先遍历

3.2 广度优先遍历BFS

3.3 深度优先遍历DFS

https://visualgo.net/zh/dfsbfs

# 图的深度优先遍历
# 1.利用栈实现
# 2.从源节点开始把节点按照深度放入栈,然后弹出
# 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
# 4.直到栈变空

DFS(u)

for each neighbor v of u

  if v is unvisited, tree edge, DFS(v)

  else if v is explored, bidirectional/back edge

  else if v is visited, forward/cross edge

或者用python的

# 图的深度优先遍历
# 1.利用栈实现
# 2.从源节点开始把节点按照深度放入栈,然后弹出
# 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
# 4.直到栈变空
def dfs(node):
    if node is None:
        return
    nodeSet = set()
    stack = []
    print(node.value)
    nodeSet.add(node)
    stack.append(node)
    while len(stack) > 0:
        cur = stack.pop()               # 弹出最近入栈的节点
        for next in cur.nexts:         # 遍历该节点的邻接节点
            if next not in nodeSet:    # 如果邻接节点不重复
                stack.append(cur)       # 把节点压入
                stack.append(next)      # 把邻接节点压入
                set.add(next)           # 登记节点
                print(next.value)       # 打印节点值
                break                   # 退出,保持深度优先

参考

数据结构(七)图

https://visualgo.net/en

数据结构—图的详细介绍

你可能感兴趣的:(数据结构)