크래프톤 정글/정글에서 문제풀기

이진 탐색 트리 Q4. 한 개의 스택으로 후위 순회하기

cedis 2026. 4. 9. 10:28
자료구조 C 실습 · 이진 탐색 트리 · Q4
이진 탐색 트리 Q4. 한 개의 스택으로 후위 순회하기
C 파일 하나를 문제 하나로 보고 정리한 풀이 글이다.
이번 글은 함수가 실제로 어떤 연결, 순회, 변환을 수행하는지에 초점을 맞춘다.
Section F Binary Search Tree postOrderIterativeS1

후위 순회를 한 개의 스택만으로 구현하는 문제다. 후위 순회는 현재 노드를 바로 출력할 수 없어서, 마지막으로 방문한 노드나 오른쪽 서브트리 처리 여부를 같이 기억해야 한다. 그래서 전위/중위보다 구현 난도가 높다.

한눈에 보는 문제 정보
원본 파일: C:\Users\cedis\OneDrive\문서\ANTIWORK\WEKK6~~~~~\data_structures_docker\Data-Structures\Binary_Search_Tree\Q4_F_BST.c
대상 함수: postOrderIterativeS1
카테고리: 이진 탐색 트리

문제에서 요구한 것

메뉴와 출력 문자열을 보면 이 파일은 특정 자료구조 연산 하나를 직접 구현하도록 만든 실습 문제다. 입력 흐름은 아래처럼 정리할 수 있다.

  • 1: Insert an integer into the binary search tree
  • 2: Print the post-order traversal of the binary search tree
  • 0: Quit
  • Input an integer that you want to insert into the Binary Search Tree
  • The resulting post-order traversal of the binary search tree is
  • %d

핵심 구현 흐름

STEP 1
왼쪽 가지를 끝까지 따라가며 스택에 쌓는다.
STEP 2
스택 top을 보면서 오른쪽 서브트리를 아직 안 갔으면 오른쪽으로 이동한다.
STEP 3
양쪽 자식을 모두 처리한 시점에만 현재 노드를 출력한다.

핵심 코드

문제 파일 전체를 다 옮기기보다, 실제로 구현해야 했던 함수만 뽑아서 보면 로직이 더 선명하게 들어온다.

핵심 코드: postOrderIterativeS1
void postOrderIterativeS1(BSTNode *root)
{
	Stack s;
    BSTNode *prev = NULL;
    BSTNode *cur;

    s.top = NULL;

    while (root != NULL || !isEmpty(&s))
    {
        if (root != NULL)
        {
            push(&s, root);
            root = root->left;
        }
        else
        {
            cur = peek(&s);

            if (cur->right != NULL && cur->right != prev)
            {
                root = cur->right;
            }
            else
            {
                cur = pop(&s);
                printf("%d ", cur->item);
                prev = cur;
            }
        }
    }
}

구현할 때 체크할 점

  • 오른쪽 서브트리를 이미 방문했는지 추적하지 않으면 같은 노드를 여러 번 본다.
  • 후위 순회는 출력 시점이 가장 늦기 때문에 상태 관리가 조금만 틀려도 순서가 무너진다.

마무리

이 문제는 거대한 알고리즘을 묻는 문제라기보다, 자료구조를 실제 포인터 연결과 순회 흐름으로 이해하고 있는지 확인하는 실습에 가깝다. 후위 순회는 현재 노드를 바로 출력할 수 없어서, 마지막으로 방문한 노드나 오른쪽 서브트리 처리 여부를 같이 기억해야 한다. 그래서 전위/중위보다 구현 난도가 높다.

같은 카테고리의 다른 문제와 함께 보면, 연결 리스트에서는 재배선, 스택과 큐에서는 순서 제어, 트리에서는 재귀 순회라는 감각이 반복해서 나온다는 점도 같이 볼 수 있다.