红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec22-23 Tree and Graph Traversalsaring

Lec22-23 Tree and Graph Traversalsaring

## 树的遍历

image-20250917104407365
  • 层序遍历:从上到下,从左到右的遍历(DBFACEG)
  • 深度优先遍历:首先遍历深度节点
    • 前序遍历:访问当前节点->遍历左侧节点->遍历右侧节点(DBACFEG)
    • 中序遍历:遍历左侧节点->访问当前节点->遍历右侧节点(ABCDEFG)
    • 后序遍历:遍历左侧节点->遍历右侧节点->访问当前节点(ACBEGFD)

树有助于表示严格层序关系,但不一定所有的关系都是层序关系,比如存在环的地图

定义

一个图由:

  • 一组节点
  • 0或多条边,每条边连接了两个节点

简单图

  • 没有边自己连接自己的节点
  • 没有两条边连接相同节点

一些术语

  • 邻接顶点:彼此有边的顶点
  • 权重:顶点和边上都可以包含值
  • 路径:由边连接的顶点序列
    • 简单路径:没有重复顶点的路径
  • 环:第一个和最后一个顶点相同
    • 存在至少一个环的图称为有环图
  • 连通:若两个顶点间存在一条路径,则我们认为这两个顶点是连通的。若所有顶点连通,则图是连通的

API

图的表示

邻接矩阵

对于图若从s到t存在一条边,对应矩阵的元素设为1

对于无向图,s到t存在边则t到s也存在,邻接矩阵中是对称表现

采用这种数据结构表示的话,需要开一个很大的数组,并且会有很多空间被浪费掉

邻接表

按顶点数维护一个列表,即对于顶点i作为index,与之相连的节点作为该index下的元素存入

若V是定点总数,E是边总数,则时间复杂度为\(\Theta(V+E)\)

图的遍历

寻找一个从s到任意可以到达的顶点v,最多访问每个顶点一次

DFS

优先尽量往深处搜索,dfs(v)如下:

  • 标记v
  • 对每一个没有标记的邻接节点w
    • 设置edgeTo[w]=v
    • dfs(w)

这个遍历顺序称为DFS前序遍历:在dfs遍历邻居前进行操作

同样还有DFS后序遍历:在dfs遍历邻居后进行操作

我们使用邻接表实现:

BFS

广度优先遍历,即按照与s的距离的顺序操作

这种遍历的搜索优先考虑广度而非深度