ใน C++ เราสามารถลบต้นไม้ไบนารีทั้งหมดได้อย่างมีประสิทธิภาพโดยใช้ Destructor ร่วมกับคีย์เวิร์ด delete บนโหนดราก (root node) ซึ่งจะเรียก destructor แบบเวียนเกิด (recursive) ไปยังโหนดลูกทั้งหมด
โครงสร้างโหนด (Node Structure)
class btree_node {
public:
int data;
btree_node* leftChild;
btree_node* rightChild;
// Constructor
btree_node(int data) {
this->data = data;
this->leftChild = NULL;
this->rightChild = NULL;
}
// Destructor - ลบลูกซ้ายและขวาเมื่อถูกเรียก
~btree_node() {
delete leftChild;
delete rightChild;
cout << this->data << " is being deleted" << endl;
}
};
ตัวอย่างการใช้งาน
#include <iostream>
using namespace std;
class btree_node {
public:
int data;
btree_node* leftChild;
btree_node* rightChild;
btree_node(int data) {
this->data = data;
this->leftChild = NULL;
this->rightChild = NULL;
}
~btree_node() {
delete leftChild;
delete rightChild;
cout << this->data << " is being deleted" << endl;
}
};
int main() {
// สร้างต้นไม้
btree_node* root = new btree_node(2);
btree_node* node1 = new btree_node(4);
btree_node* node2 = new btree_node(6);
btree_node* node3 = new btree_node(8);
btree_node* node4 = new btree_node(10);
root->leftChild = node1;
root->rightChild = node2;
node1->leftChild = node3;
node1->rightChild = node4;
// ลบต้นไม้ทั้งหมด - เริ่มจากราก
delete root;
return 0;
}
ผลลัพธ์
8 is being deleted 10 is being deleted 4 is being deleted 6 is being deleted 2 is being deleted
หลักการทำงาน: เมื่อ delete root ถูกเรียก Destructor ของ root จะทำงาน ซึ่งเรียก delete leftChild และ delete rightChild ทำให้ Destructor ของโหนดลูกทำงานต่อเนื่องกันจนครบทุกโหนด (Post-order traversal)