Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 delete 키워드를 활용한 이진 트리 삭제 방법

이번 튜토리얼에서는 C++에서 delete 키워드를 사용하여 이진 트리(binary tree) 전체를 삭제하는 방법을 알아보겠습니다.

소멸자(Destructor)란?

이진 트리를 삭제하기 위해 소멸자(destructor) 멤버 함수를 활용합니다. 소멸자는 객체가 스코프(scope)를 벗어나거나 delete 호출에 의해 명시적으로 제거될 때 자동으로 실행되는 특수한 멤버 함수입니다.

소멸자의 이름은 클래스 이름 앞에 물결표(~)를 붙인 형태로 정의합니다. 이러한 특성을 이용하면 루트 노드만 delete 해주어도 재귀적으로 모든 하위 노드가 순서대로 해제됩니다.

문제 해결 절차

  • Node라는 이름의 클래스를 작성합니다.
  • 노드 데이터를 받아 초기화하는 생성자(constructor)를 작성합니다.
  • 소멸자(destructor) 함수를 작성합니다.
    • 왼쪽 자식 노드를 삭제합니다.
    • 오른쪽 자식 노드를 삭제합니다.
    • 현재 노드의 데이터를 출력합니다.
  • 더미(dummy) 데이터로 이진 트리를 초기화합니다.
  • delete root 문장을 사용하여 이진 트리 전체를 삭제합니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;
class Node {
    public:
    int data;
    Node* left;
    Node* right;
    // 생성자
    Node(int data) {
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
    // 소멸자
    ~Node() {
        // 왼쪽과 오른쪽 포인터 삭제
        delete left;
        delete right;
        // 노드 데이터 출력
        cout << "Deleted node with data " << this->data << endl;
    }
};
int main() {
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    root->right->left = new Node(6);
    root->right->right = new Node(7);
    // 소멸자를 통해 트리 전체 삭제
    delete root;
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Deleted node with data 4
Deleted node with data 5
Deleted node with data 2
Deleted node with data 6
Deleted node with data 7
Deleted node with data 3
Deleted node with data 1

결과 분석

출력 결과를 보면 리프 노드부터 시작해 후위 순회(post-order traversal) 방식으로 노드가 삭제되는 것을 확인할 수 있습니다. 소멸자 내부에서 먼저 왼쪽과 오른쪽 자식을 delete 하기 때문에, 자식 노드들이 모두 해제된 후에야 부모 노드가 삭제됩니다. 마지막에는 루트 노드(데이터 1)가 가장 늦게 해제되며 메모리 누수 없이 트리 전체가 깔끔하게 정리됩니다.

마무리

C++의 소멸자와 delete 키워드를 조합하면 별도의 순회 함수 없이도 이진 트리를 간단하고 안전하게 삭제할 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.