- recursive
- for → if unused → used check → recursive → unchecked
- stack
- 짧은 거리는 BFS가 유효하다면, DFS는 경로 전체가 유효한지 확인
- 가지치기 필요
- 세팅에 필요한 저장공간은 적다
- pre-order / in-order / post-order 에 따라 용법 다르다
pre-order DFS
- 방문 자체가 목적일 때
- 백트래킹 (경로 탐색, 조합, 순열)
-
void dfs(Node* node) {
if (!node) return;
visit(node);
dfs(node->left);
dfs(node->right);
}
- 간선 만 주어진 경우의 부모 찾기
- 트리에서 dfs 할 때, 지금 노드 기준으로 방문안한 노드가 있다는 것은 지금 노드가 부모라는 뜻
Link to original
-
def dfs(u):
visit[u] = true
for v in adj[u]:
if not visit[v]:
parent[v] = u
dfs(v)
in-order DFS
- BST나 중위 수식 등, 정렬 성질 사용
- BST 순회 (오름차순 정렬된 값 추출)
-
void dfs(Node* node) {
if (!node) return;
dfs(node->left);
visit(node);
dfs(node->right);
}
post-order DFS
- 결과를 누적하거나 처리할 때
- 디렉터리 처리
- 트리 삭제(bottom-up)
- 용량 계산 (하위 폴더 다 처리 후, 부모 처리)
- 트리 DP
- Hierholzer’s algorithm (오일러 경로)
-
void dfs(Node* node) {
if (!node) return;
dfs(node->left);
dfs(node->right);
visit(node);
}