새발블로그

트리의 재귀적 특성 활용하기 본문

Problem Solving/Refer

트리의 재귀적 특성 활용하기

EUG 2025. 7. 4. 17:35

1. 트리가 재귀에 적합한 이유

트리는 "부모 + 자식(서브트리)" 구조로 되어 있다.
즉, 작은 문제(서브트리)를 해결 → 부모 노드에서 결과를 종합 → 전체 트리 해결

 

핵심 아이디어

자식 노드를 먼저 처리(재귀 호출) → 결과를 부모에서 합산 또는 가공

2. 대표 문제 유형

  • 서브트리 크기 구하기
  • 트리의 높이 구하기
  • 부모 정보 기록
  • 서브트리 값의 합 (Bottom-up)
  • 값 전파 (Top-down)

3. 예시

(1) 서브트리 크기

int dfs(Node node) {
    int size = 1;
    for (Node child : node.children) {
        size += dfs(child);
    }
    return size;
}

(2) 트리 높이

int dfs(Node node) {
    if (node.children.isEmpty()) return 0;
    int maxDepth = 0;
    for (Node child : node.children) {
        maxDepth = Math.max(maxDepth, dfs(child));
    }
    return maxDepth + 1;
}

(3) 부모 정보 기록

void dfs(Node node, Node parent) {
    parentMap.put(node, parent);
    for (Node child : node.children) {
        dfs(child, node);
    }
}

(4) 서브트리 값의 합 (Bottom-up)

int dfs(Node node) {
    int sum = node.value;
    for (Node child : node.children) {
        sum += dfs(child);
    }
    return sum;
}
  • 출제 포인트: "서브트리 합"이라는 키워드 → 자식 값을 모아서 부모가 계산

(5) 값 전파 (Top-down)

void dfs(Node node, int inheritedValue) {
    node.value += inheritedValue; // 부모로부터 받은 값 더함
    for (Node child : node.children) {
        dfs(child, node.value);   // 현재까지 누적된 값을 자식에게 전달
    }
}
  • 출제 포인트: "부모에서 자식으로 정보 전달" → 전위 순회(Preorder) 형태

4. 출제 포인트

  • "서브트리", "합산", "누적 값" 같은 단어가 보이면 DFS 재귀 패턴
  • 자식 → 부모: 후위 순회(Postorder) / 부모 → 자식: 전위 순회(Preorder)
  • DP + 트리 구조 → 거의 대부분 DFS 1회로 해결

 

[백준 11725] 트리의 부모 찾기 → 부모 정보 기록

[백준 15681] 트리와 쿼리 → 서브트리 크기 계산

[백준 2213] 트리의 독립집합 → 트리 DP (서브트리 값 합 패턴)

[LeetCode 124] Binary Tree Maximum Path Sum → 서브트리 값 합 응용

[백준 1991] 트리 순회 → 전위/중위/후위 순회 기본기

'Problem Solving > Refer' 카테고리의 다른 글

백트래킹, 가지치기 구현 템플릿  (0) 2025.07.04
레벨 순회 (Level Order Traversal, BFS)  (0) 2025.07.04
트리 dfs 구현 템플릿  (0) 2025.07.04
트리 bfs 구현 템플릿  (0) 2025.07.04
트리 구현 방식 정리  (0) 2025.07.04