图结构与遍历.md 2.5 KB


title: 图结构与遍历 tags:

  • module
  • data-structure-and-algorithm
  • graph
  • joplin type: module source_type: reconstructed created: 2026-04-22 updated: 2026-04-22 ---

图结构与遍历

[!abstract] 这一模块处理比树更一般的关系结构。图的难点不在定义,而在“如何存、如何遍历、如何理解顶点之间的复杂连接”。

模块结论

  • [[图]] 适合表达多对多连接关系,是树结构的推广。
  • 邻接矩阵和邻接表分别强调“查询方便”和“存边节省”。
  • BFS 和 DFS 本质上是两种不同的扩展路径策略,分别依赖 [[队列]] 和 [[栈]] / 递归思维。

一、图的基本组成

  • 顶点
  • 有向图 / 无向图
  • 带权图 / 无权图

为什么图比树更一般

  • 树没有回路,且层次关系更明确。
  • 图可以存在回路、交叉连接和更复杂的路径关系。

二、图的存储结构

邻接矩阵

  • 用二维数组表示边关系。
  • 优点是判断两点是否直接相连很直观。
  • 缺点是在稀疏图里浪费空间。

邻接表

  • 每个顶点维护自己的边表。
  • 优点是适合稀疏图,按边存储更节省空间。
  • 缺点是判断任意两点是否直接相连不如邻接矩阵直观。

三、广度优先搜索 BFS

  • 按“距离起点一层一层扩展”的方式遍历。
  • 核心辅助结构是队列。
  • 常用于最短路径层次扩展、连通性检查等场景。

四、深度优先搜索 DFS

  • 一条路尽量走到底,再回溯。
  • 核心辅助结构是递归调用栈或显式栈。
  • 常用于连通分量、拓扑处理前的遍历框架等场景。

五、比较 BFS 与 DFS

  • BFS 更像层次推进。
  • DFS 更像路径深入。
  • 一个偏“广度扩散”,一个偏“深度探路”。

六、易错点

  • 图遍历必须配合 visited 标记,否则容易在回路里重复访问。
  • 邻接矩阵和邻接表不是谁绝对更好,要看图的稠密程度和操作需求。
  • BFS / DFS 顺序会受到顶点存储次序和邻接点访问次序影响。

七、复习提问

  • 邻接矩阵和邻接表分别适合什么图?
  • BFS 为什么天然适合层次最短路问题?
  • DFS 为什么常和递归写法联系在一起?

来源

  • [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/11.图.md]]
  • [[raw/Joplin/计算机专业基础/数据结构与算法/(C)840数据结构与算法/7.图.md]]

相关页面

  • [[数据结构与算法]]
  • [[图]]
  • [[栈]]
  • [[队列]]