download

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