Avl Tree C++

6 min read Jun 28, 2024
Avl Tree C++

Pohon AVL di C++

Pohon AVL merupakan jenis pohon pencarian biner seimbang yang dikembangkan oleh Georgy Adelson-Velsky dan Evgenii Landis pada tahun 1962. Pohon AVL menjamin bahwa tinggi pohon tetap seimbang dengan memutar node ketika diperlukan, sehingga operasi pencarian, penyisipan, dan penghapusan dapat dilakukan dengan kompleksitas waktu logaritmik.

Keuntungan Pohon AVL

  • Pencarian yang lebih cepat: Karena pohon AVL seimbang, pencarian elemen dapat dilakukan dengan kompleksitas waktu logaritmik, lebih cepat daripada pohon pencarian biner biasa yang dapat memiliki kompleksitas waktu linear dalam kasus terburuk.
  • Penyisipan dan penghapusan yang efisien: Operasi penyisipan dan penghapusan pada pohon AVL juga memiliki kompleksitas waktu logaritmik, menjaga keseimbangan pohon dan efisiensi operasi.
  • Kompleksitas ruang logaritmik: Pohon AVL memiliki kompleksitas ruang logaritmik, sehingga cocok untuk menyimpan dataset besar.

Implementasi Pohon AVL di C++

Berikut adalah contoh implementasi pohon AVL di C++:

#include 

// Struktur Node AVL
struct Node {
  int data;
  int height;
  Node *left;
  Node *right;

  Node(int data) {
    this->data = data;
    this->height = 1;
    this->left = this->right = nullptr;
  }
};

// Fungsi untuk menghitung tinggi node
int height(Node *node) {
  if (node == nullptr) {
    return 0;
  }
  return node->height;
}

// Fungsi untuk menghitung faktor keseimbangan node
int getBalance(Node *node) {
  if (node == nullptr) {
    return 0;
  }
  return height(node->left) - height(node->right);
}

// Fungsi untuk melakukan rotasi kanan pada node
Node* rightRotate(Node *y) {
  Node *x = y->left;
  Node *T2 = x->right;

  // Lakukan rotasi
  x->right = y;
  y->left = T2;

  // Perbarui tinggi
  y->height = std::max(height(y->left), height(y->right)) + 1;
  x->height = std::max(height(x->left), height(x->right)) + 1;

  // Kembalikan node baru
  return x;
}

// Fungsi untuk melakukan rotasi kiri pada node
Node* leftRotate(Node *x) {
  Node *y = x->right;
  Node *T2 = y->left;

  // Lakukan rotasi
  y->left = x;
  x->right = T2;

  // Perbarui tinggi
  x->height = std::max(height(x->left), height(x->right)) + 1;
  y->height = std::max(height(y->left), height(y->right)) + 1;

  // Kembalikan node baru
  return y;
}

// Fungsi untuk menyisipkan node baru ke dalam pohon AVL
Node* insert(Node *node, int data) {
  // Jika pohon kosong, buat node baru
  if (node == nullptr) {
    return new Node(data);
  }

  // Rekursi untuk menemukan posisi penyisipan
  if (data < node->data) {
    node->left = insert(node->left, data);
  } else if (data > node->data) {
    node->right = insert(node->right, data);
  } else {
    return node; // Jika data sudah ada, kembalikan node yang ada
  }

  // Perbarui tinggi node saat ini
  node->height = std::max(height(node->left), height(node->right)) + 1;

  // Hitung faktor keseimbangan
  int balance = getBalance(node);

  // Rotasi untuk menjaga keseimbangan
  // Kasus 1: Left Left
  if (balance > 1 && data < node->left->data) {
    return rightRotate(node);
  }

  // Kasus 2: Right Right
  if (balance < -1 && data > node->right->data) {
    return leftRotate(node);
  }

  // Kasus 3: Left Right
  if (balance > 1 && data > node->left->data) {
    node->left = leftRotate(node->left);
    return rightRotate(node);
  }

  // Kasus 4: Right Left
  if (balance < -1 && data < node->right->data) {
    node->right = rightRotate(node->right);
    return leftRotate(node);
  }

  // Kembalikan node yang diperbarui
  return node;
}

// Fungsi utama
int main() {
  Node *root = nullptr;

  // Sisipkan beberapa node
  root = insert(root, 10);
  root = insert(root, 20);
  root = insert(root, 30);
  root = insert(root, 40);
  root = insert(root, 50);
  root = insert(root, 25);

  // Cetak data pohon AVL
  std::cout << "Pohon AVL:\n";
  // ... (Fungsi untuk mencetak pohon AVL)

  return 0;
}

Kode di atas menunjukkan implementasi dasar pohon AVL di C++, termasuk struktur node, fungsi perhitungan tinggi dan faktor keseimbangan, serta fungsi rotasi kiri dan kanan. Fungsi insert() bertanggung jawab untuk memasukkan node baru dan menjaga keseimbangan pohon AVL.

Kesimpulan

Pohon AVL merupakan struktur data yang efisien dan seimbang yang menawarkan keuntungan kinerja yang signifikan dalam operasi pencarian, penyisipan, dan penghapusan. Implementasi di C++ memberikan framework dasar untuk membangun dan memanipulasi pohon AVL, memungkinkan pengembang untuk memanfaatkan efisiensi dan keandalannya dalam berbagai aplikasi.