Day 64: Python 트리에서 깊이 우선 탐색(DFS), 재귀 없이 깊은 탐색을 위한 스택 기반 반복 순회

발행: (2025년 12월 14일 오후 11:48 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

Day 64 핵심 정리: 반복 DFS 함수

1. 함수 설계: 스택 및 방문 리스트 초기화

dfs 함수는 트리 딕셔너리와 시작 노드를 받아서 탐색 순서를 반환합니다:

def dfs(tree: dict, start):
    """Perform DFS traversal starting from the given node."""
    visited = []          # store traversal order
    stack = [start]       # stack for DFS (LIFO)

2. 루프 처리: 팝 → 방문 → 자식 역순 푸시

핵심 while‑loop가 스택을 처리합니다:

    while stack:
        node = stack.pop()               # take the top node from stack

        if node not in visited:
            visited.append(node)         # mark node as visited

            # push children in reverse order to maintain left‑to‑right traversal
            for child in reversed(tree.get(node, [])):
                stack.append(child)

    return visited
  • 노드를 팝하고 아직 방문하지 않았다면 visited에 추가합니다(전위 순회).
  • 자식을 역순으로 푸시하여 가장 왼쪽 자식이 먼저 처리되도록 합니다.
  • tree.get(node, [])는 리프 노드도 안전하게 처리합니다.

3. 사용 예시: 트리 정의 및 출력

딕셔너리 기반 트리로 시연합니다:

tree = {
    "A": ["B", "C"],
    "B": ["D", "E"],
    "C": ["F"],
    "D": [],
    "E": [],
    "F": []
}

start_node = "A"

print("Tree:", tree)
print(f"Starting DFS from node: {start_node}")

traversal = dfs(tree, start_node)
print(f"DFS Traversal Order: {traversal}")

스크립트를 실행하면 트리를 출력하고 A에서 DFS를 시작한 뒤 탐색 순서 [A, B, D, E, C, F]https://dev.topreorder/】를 보여줍니다.

요약 및 회고

  • 스택은 재귀를 시뮬레이션합니다 – 깊은 트리에서도 안전합니다.
  • 역순 푸시는 별도 작업 없이 좌‑우 순서를 유지합니다.
  • 팝 시점에 방문 처리하면 전위 순서가 됩니다.

재귀 방식은 깔끔하지만 깊이가 > 1000일 경우 실패할 수 있습니다. 반복 방식은 안전하고 제어하기 쉽습니다.

다음 단계 및 참고 자료

Back to Blog

관련 글

더 보기 »

팰린드롬 검사기

팔린드롬이란 무엇인가? 팔린드롬은 단어, 구절, 숫자 또는 기타 문자 시퀀스로, 공백, 구두점 및 대소문자를 무시하고 앞뒤가 동일하게 읽히는 것을 말한다.

주간 챌린지: 평균 진행

주간 챌린지 351 매주 Mohammad S. Anwar는 The Weekly Challenge https://theweeklychallenge.org/ 를 발행합니다. 이는 우리 모두가 솔루션을 고안할 기회입니다.