目录
线性结构
堆栈
队列
树
前序遍历
中序遍历
后序遍历
二叉树
图的遍历
深度优先搜索(DFS)
DFS是一个针对图和树的遍历算法。早在19世纪就被用于解决迷宫问题。
DFS使用 堆栈(stack) 进行递归实现。具体步骤如下:
- 把起始点放入stack;
- 重复下述3个步骤,直到stack为空为止:
- 从stack中访问栈顶的点;
- 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入stack中;
- 如果此点没有尚未遍历的邻接点,则将此点从stack中弹出。
遍历过程演示
基本模板:
void DFS(Vectex V){
visited[V]=1; //标记已访问
for(V的每个邻接点W){
if(!visited[W]) //如果未被访问
DFS(W);
}
}
若有N个顶点,E条边,时间复杂度是:
- 用邻接表存储图 T = O ( N + E ) T=O(N+E) T=O(N+E)
- 用邻接矩阵存储图 T = O ( N 2 ) T=O(N^2) T=O(N2)
优点:
- 能找出所有解决方案;
- 优先搜索一棵子树,然后是另一棵,所以和BFS对比,有着内存需要;
- 解决连通性问题更自然。
缺点:
- 要多次遍历,搜索所有可能路径,标识做了之后还要取消;
- 在深度很大的情况下效率不高。
实例: