บทนำ
ใน C++ สามารถลบ Binary Tree ทั้งต้นได้อัตโนมัติโดยใช้ Destructor (~) ในคลาส Node เมื่อเรียก `delete root` จะเรียก destructor แบบ Recursive ลบลูกซ้าย ลูกขวา แล้วค่อยลบตัวเอง
หลักการทำงาน
- Destructor ชื่อ ~Node()
- ใน destructor: `delete left; delete right;` → เรียก destructor ของลูกซ้ำ
- Post-order deletion: ลบลูกก่อน แล้วค่อยลบตัวเอง
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int data;
Node* left;
Node* right;
// Constructor
Node(int data) {
this->data = data;
this->left = NULL;
this->right = NULL;
}
// Destructor
~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 (ลูกซ้าย → ลูกขวา → ตัวเอง) รับประกันว่าไม่มี memory leak และไม่ access freed memory
สรุป
RAII (Resource Acquisition Is Initialization) ใน C++: ใช้ Destructor จัดการหน่วยความจำอัตโนมัติ เขียนโค้ดสะอาด ป้องกัน Memory Leak