定义
深度优先遍历(DFS)也叫深度优先搜索。它的定义是:不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。
实现步骤
- 从图中某顶点v出发
- 访问顶点v
- 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问
- 若此时尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优遍历,直到所有顶点均被访问过为止
多叉树的DFS遍历
/* 多叉树遍历框架 */
void traverse(TreeNode root) {
if (root == null) return;
// 前序位置
for (TreeNode child : root.children) {
traverse(child);
}
// 后序位置
}
图的DFS遍历
图可能包含环,所以使用visited数组记录已经遍历的元素,使用onPath判断是否成环
// 记录被遍历过的节点
boolean[] visited;
// 记录从起点到当前节点的路径
boolean[] onPath;
/* 图遍历框架 */
void traverse(Graph graph, int s) {
if (visited[s]) return;
// 经过节点 s,标记为已遍历
visited[s] = true;
// 做选择:标记节点 s 在路径上
onPath[s] = true;
for (int neighbor : graph.neighbors(s)) {
traverse(graph, neighbor);
}
// 撤销选择:节点 s 离开路径,上面那一步所有s的临接节点都已经被遍历过了
onPath[s] = false;
}