AVL Tree
AVL Tree adalah Binary Search Tree (BST) yang dapat menyeimbangkan diri sendiri di mana perbedaan antara ketinggian subtree kiri dan kanan tidak boleh lebih dari satu untuk semua node.
Implementasi AVL Tree
Berikut ini adalah implementasi untuk Penyisipan AVL Tree. Implementasi berikut menggunakan insert BST rekursif untuk memasukan node baru. Dalam insert BST rekursif, setelah insersi, kita mendapatkan pointer ke semua leluhur satu per satu secara Bottom-up atau dari bawah ke atas. Jadi kita tidak perlu parent pointer untuk melakukan perjalanannya. Kode rekursif itu sendiri bergerak ke atas dan mengunjungi semua leluhur dari simpul yang baru dimasukkan.
1) Lakukan pemasangan BST normal.
2) Node saat ini harus menjadi salah satu leluhur dari node yang baru dimasukkan. Perbarui ketinggian node saat ini.
3) Dapatkan faktor keseimbangan (tinggi subtree kiri - tinggi subtree kanan) dari node saat ini.
4) Jika faktor keseimbangan lebih besar dari 1, maka simpul saat ini tidak seimbang dan ktia berada dalam Left Left case atau Left Right case. Untuk memeriksa apakah ada Left case atau tidak, bandingkan kunci yang baru dimasukkan dengan kunci di root subtree kiri.
5) Jika faktor keseimbangan kurang dari -1, maka simpul saat ini tidak seimbang dan kami berada dalam Right Right case atau Right Left case. Untuk memeriksa apakah ada Right case atau tidak, bandingkan kunci yang baru dimasukkan dengan kunci di root subtree kanan.
Contoh program dalam C:
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int key;
struct Node *left;
struct Node *right;
int height;
};
int max(int a, int b);
int height(struct Node *N)
{
if (N == NULL)
return 0;
return N->height;
}
int max(int a, int b)
{
return (a > b)? a : b;
}
struct Node* newNode(int key)
{
struct Node* node = (struct Node*)
malloc(sizeof(struct Node));
node->key = key;
node->left = NULL;
node->right = NULL;
node->height = 1;
return(node);
}
struct Node *rightRotate(struct Node *y)
{
struct Node *x = y->left;
struct Node *T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(height(y->left), height(y->right))+1;
x->height = max(height(x->left), height(x->right))+1;
return x;
}
struct Node *leftRotate(struct Node *x)
{
struct Node *y = x->right;
struct Node *T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(height(x->left), height(x->right))+1;
y->height = max(height(y->left), height(y->right))+1;
return y;
}
int getBalance(struct Node *N)
{
if (N == NULL)
return 0;
return height(N->left) - height(N->right);
}
struct Node* insert(struct Node* node, int key)
{
if (node == NULL)
return(newNode(key));
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
else
return node;
node->height = 1 + max(height(node->left),
height(node->right));
int balance = getBalance(node);
if (balance > 1 && key < node->left->key)
return rightRotate(node);
if (balance < -1 && key > node->right->key)
return leftRotate(node);
if (balance > 1 && key > node->left->key)
{
node->left = leftRotate(node->left);
return rightRotate(node);
}
if (balance < -1 && key < node->right->key)
{
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
void preOrder(struct Node *root)
{
if(root != NULL)
{
printf("%d ", root->key);
preOrder(root->left);
preOrder(root->right);
}
}
int main()
{
struct Node *root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
printf("Preorder traversal of the constructed AVL"
" tree is \n");
preOrder(root);
return 0;
}
No comments:
Post a Comment