Matakuliah Tahun Versi : T0534/Struktur Data : 2005 : September 2005 Pertemuan 11 AVL Tree 1 Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu : • mendemonstrasikan operasi pada AVL Tree(TIK09). • menerapkan AVL Tree pada program aplikasi komputer (TIK-09). 2 Outline Materi • Terminologi • Operasi Insert – Single Rotation – Double Rotation • Representasi • Implementasi 3 Terminologi AVL Tree adalah BST dengan ketentuan |height(LS)-height(RS)|<2 Height-Balanced Tree BST adalah Height-Balanced p-Tree, yang berarti maksimum perbedaan height antara subtree kiri dan kanan adalah p. AVL Tree adalah Height-Balanced 1-Tree yang berarti maksimum perbedaan tinggi antara subtree kiri dan kanan adalah 1. Balancing : •TallLeft (–):subtree kiri lebih tinggi dari subtree kanan. •TallRight(+):subtree kanan lebih tinggi dari subtree kiri. •Balance (0):tinggi subtree kiri&kanan sama. balance factor = -1 balance factor = 1 balance factor = 0 Search Path Path pencarian lokasi untuk dilakukan operasi INSERT, (dimulai dari Root). Pivot Point Adalah Node pada Search Path yang balancenya TallLeft atau TallRight dan terletak paling dekat dengan node yang baru. 4 Operasi Insert • Operasi INSERT pada AVL tree harus tetap menghasilkan AVL Tree (tidak mengubah ketentuan AVL Tree). • Setiap penambahan node baru, ada kemungkinan menyebabkan non AVL Tree, untuk itu perlu dilakukan rebalancing / regenerate. • Proses rebalancing dilakukan dengan cara melakukan rotasi pada subtree. • Penambahan node baru pada kondisi seluruh subtree balance, rebalancing tidak diperlukan lagi setelah proses INSERT. 5 Kasus 1 Tidak ada pivot point dan setiap node adalah balance, maka insert bisa langsung dilakukan sama seperti BST (tanpa rebalancing). Contoh : 0 54 54 0 0 30 70 Sebelum Insert(80) 0 30 + + 70 0 80 Sesudah Insert(80) 6 Kasus 2 Ada pivot point tetapi subtree yang akan diinsert lebih pendek, maka insert langsung bisa dilakukan. Contoh : 54 0 30 54 + - + Sebelum Insert(10) + 30 70 0 80 0 0 10 70 80 0 Sesudah Insert(10) 7 Kasus 3 Jika ada pivot point dan subtree yang akan diinsert lebih tinggi, maka TREE harus digenerate, supaya tetap menghasilkan AVL TREE. Regenerate : – Single Rotation – Double Rotation 8 Single Rotation Remainder of the tree Remainder of the tree p1 B p1 A p2 (pivot) A p3 B T3 T1 T1 T2 T2 T3 New node (a) 54 30 0 20 (b) 54 - - - 0 + 30 0 20 70 54 0 20 70 0 10 0 70 0 30 10 9 Double Rotation Remainder of the tree Remainder of the tree p1 B p1 0 5 C p2 (pivot) 10 0 20 30 60 0 40 0 + 80 50 10 0 90 0 0 5 0 20 30 60 0 40 0 + 80 50 0 90 0 55 p3 A A Sebelum Insert 55 B T4 Insert 55 C p4 T2 T1 T1 T2 T3 60 T4 40 T3 20 salah satu dari ini adalah node yang baru 10 80 90 50 30 55 0 5 10 20 40 0 0 60 + 0 + 30 50 80 0 0 55 90 5 Setelah Rotasi I Setelah Rotasi II 10 Implementasi ##define IS_FULL(ptr) (!ptr) ##define FALSE = 0 ##define TRUE = 1 /* Representation */ typedef struct { int key; } element; typedef struct tree_node *tree_pointer; struct tree_node { tree_pointer left_child; element data; short int bf; tree_pointer right_child; }; int unbalanced = FALSE; tree_pointer root=NULL; 11 Implementasi(2) void avl_insert(tree_pointer *parent, element x, int *unbalanced) { if (!parent) { *unbalanced = TRUE; parent=(tree_pointer) malloc(sizeof(tree_node)); if (IS_FULL(!parent)) { fprintf(stderrr,"The memory is full\n"); exit(1); }; avl_insert((*parent)->left_child, x, unbalanced); (*parent)->left_child=(*parent)->right_child=NULL; if (*unbalanced) { (*parent)->bf=0; /* left branch has grown higher */ (*parent)->data=x; switch((*parent)->bf){ } case -1:(*parent)->bf=0;* else if(x.key<(*parent)->data.key){ unbalanced=FALSE; break; … case 0 :(*parent)->bf=1; break; } case 1 :left_rotation(parent,unbalanced);}} else if(x.key>(*parent)->data.key){ … avl_insert((*parent)->right_child, x, unbalanced); } if (*unbalanced) { else { /* right branch has grown higher */ *unbalanced = FALSE; switch((*parent)->bf){ printf("The key is already in the tree"); case 1 :(*parent)->bf=0; } *unbalanced=FALSE;break; }; case 0 :(*parent)->bf=1;break; case 1 :right_rotation(parent,unbalanced); }} 12 Selesai 13
© Copyright 2024 Paperzz