Lec22-23 Tree and Graph Traversalsaring
## 树的遍历
- 层序遍历:从上到下,从左到右的遍历(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的距离的顺序操作
这种遍历的搜索优先考虑广度而非深度