트리 순회 (Tree Traversal)

2025. 2. 14. 23:27C++ study

전위 순회(Preorder Traveral)

  • 방문 순서: 루트왼쪽 서브트리→오른쪽 서브트리
  • 예를 들어서 트리가 다음 처럼 주어진다고 하자!
        1
       / \
      2   3
     / \   \
    4   5   6
  • 이렇게 주어진다면 1-2-4-5-3-6의 방식으로 순회하게 된다!
코드로 작성한다면 다음과 같이 작성할 수 있다
void preorder(Node* root) {
    if (root == nullptr) return;
    cout << root->val << " "; // 루트 방문
    preorder(root->left);     // 왼쪽 서브트리 방문
    preorder(root->right);    // 오른쪽 서브트리 방문
}​


위의 코드처럼 만약 자식 노드가 없다면 return을 해주고 만약 자식 노드가 있다면 왼쪽을 먼저 하고 다음을 오른쪽으로 순회해 준다!

중위 순회(Inorder Traversal)

  • 방문 순서: 왼쪽 서브트리→루트오른쪽 서브트리
  • 이전 예시의 트리로 예를 든다면 4-2-5-1-3-6의 순서로 탐색을 진행하게 된다!
코드로 작성한다면 다음과 같이 작성할 수 있다
void inorder(Node* root) {
    if (root == nullptr) return;
    inorder(root->left);     // 왼쪽 서브트리 방문
    cout << root->val << " "; // 루트 방문
    inorder(root->right);    // 오른쪽 서브트리 방문
}


중위 순회를 구하는 방식은 전위 순회랑 비슷하지만 왼쪽 서브트리를 순회를 한 다음에 오른쪽 서브트리를 방문한다는 것에서 차이점이 있다.

후위 순회(Postorder Traversal)

  • 방문 순서:  왼쪽 서브트리→오른쪽 서브트리→루트
  • 이전 예시의 트리로 예를 든다면 4-5-2-6-3-1의 순서로 탐색을 진행하게 된다!
코드로 작성한다면 다음과 같이 작성할 수 있다
void postorder(Node* root) {
    if (root == nullptr) return;
    postorder(root->left);     // 왼쪽 서브트리 방문
    postorder(root->right);    // 오른쪽 서브트리 방문
    cout << root->val << " ";  // 루트 방문
}​

 

여기에서는 왼쪽과 오른쪽을 다 방문한 다음에 루트노트를 방문하게 된다!

레벨 순회(Level-order Tarversal)

  • 방문 순서: 루트-왼쪽-오른쪽 
  • 단 방문을 하게 된다면 층별로 정점을 방문하게 된다.
  • BFS탐색을 적용한다면 쉽게 표현할 수 있다.
벙식 순서 사용 방식
전위 순회 루트 → 왼쪽 → 오른쪽 복사, 수식 표기
중위 순회 왼쪽 → 루트 → 오른쪽 BST에서 정렬된 출력
후위 순회 왼쪽 → 오른쪽 → 루트 트리 삭제
레벨 순회 층별로 (BFS) 최단 경로 탐색

'C++ study' 카테고리의 다른 글

SCC (Strongly Connected Component)  (0) 2025.02.16
외접원의 성질  (0) 2025.02.15
Meet In The Middle  (0) 2025.02.12
피보나치 수(Algorithm)  (0) 2025.02.10
오일러 투어 테크닉  (2) 2025.02.08