ALV (Adel’son Vel’sii Landis) Tree adalah bentuk khusus dari BST
dimana perbedaan tinggi sub pohon kiri dengan tinggi sub pohon kanan maksimum 1
untuk setiap node.atau perbedaan jumlah level kekiri dengan jumlah level ke kanan
berbeda maksimum 1. Jika perbedaan melebihin dari 1, maka pohon tersebut disebut
tidak seimbang. Jadi terhadap setiap node pada AVL Tree diberikan sebuah bilangan
yang menyatakan factor keseimbangan(balncing factor), factor keseimbangan dapat di
definisikan dengan (tinggi sub pohon kanan) - (tinggi sub pohonkiri) atau sebaliknya
sepanjang kita harus konsissten menggunakan hanya salah satu. AVL adalah singkatan
dari nama dua orang ahli matematika soviet sebagai pencipta pohon tersebut yakni :
G.M. Adel’son-Vel’skii dan e.M. Landis yang menemukan metode pembentukan pohon
pencarian biner seimbang pada tahun 1962. Dengan AVL Tree maka operasi –
operasinya membutuhkan waktu 0(log n), bahkan untuk kasus paling jelek (worst case).
Tinggi pohon AVL telah dibuktikan bahwa tidak pernah melebihi 1,44 2log n atau 1,44
lg n. dengan definisi factor keseimbangan diatas, maka deklarasi AVL Tree dapat dibuat
sebagai berikut:
Type
Pointer=^simpul
Simpul=record
Kiri :pointer;
FK :shothInt;
Kanan :pointer;
End;
AVL Tree=pointer;
Deklarasi simpul diatas dapat di gambarkan seperti gambar 4.6 berikut ini:
• •
Contoh: misalkan kita meemiliki BST dengan data 2,3,7,11 ddengan urutan masuk
3,7,11,2 maka akan diperoleh BST dengan definisi simpul yang ditambah dengan FK
dapat di gambarkan seperti gambar 4.7. dibawah ini:
• 3 +1 •
• 2 0 • • 7 +1 •
• 11 0 •
Gambar 4.7.. BTS yang merupakan AVL Tree
Dari gambar 4.7 diatas dapat kita lihat bahwa node 3 memiliki FK=+1 (2-1),
node 2 memiliki Fk=0, node 7 dengan FK=+1 (1-0) sedangkan node 11 memiliki FK=
0.
Akan tetapi jika urutan masuk data dilakukan 2,7,3,11 ke dalam pohon B, maka
akan kita mendapatkan BST dengan akar =2 (data minimum), kemudian level 2 ke
kanan dari 2 adalah 7, kemudian pada level 3 ditempati olah 3 di sebelah kiri 7 dan 11
di sebelah kanan 7, sehingga diperoleh gambar seperti gambar 4.8. berikut ini:
• B
• 2 +1 •
• 7 0 •
• 3 0 • • 11 0 •
B •
• 11 -3 •
• 7 -2 •
• 2 +1 •
• 3 0 •
Gambar 4.9 BST B lain yang bukan AVL Tree
Pohon B pada gambar 4.9 diatad jelas bukan AVL Tree. FK(3)=0; FK(2)=+1;
FK(7)=(0-2) =-2; FK(11) =(0-3). Kemudian apabila terdapat pohon b pada gambar 4.8
diatas kita sisipkan data 1 ke sebelah kiri dari 2, maka pohon yang diperoleh seperti
pada gambar 4.10 dibawah ini merupakan AVL Tree.
• B
• 2 +1 •
• 1 0 • • 7 0 •
• 3 0 • • 11 0 •
• A
• 3 +2 •
• 2 0 • • 7 +2 •
• 11 +1 •
Perhatikan gambar 4.11 diatas, FK(7) =+2 demikian juga FK(3). Dalam hal ini
ketidak seimbangan di node 3 dapat di perbaiki andai kata kita lakukan penyeimbangan
pada node 7 yang sering kita sebut dengan pivot, penyeimbangan pada node 7 dilakukan
dengan membuat rotasi ke kiri satu kali pada node 11, proses tersebut dilakukan dengan
mengubah struktur (hubungan) sub pohon yang berisi 7,11 dan 13 sebagai berikut:
Dengan demikian di peroleh pohon baru seperti pada gambar 4.12 berikut ini:
• A
• 3 +2 •
• 2 0 • • 11 +1 •
• 7 +2 • • 13 0 •
Operasi yang dapat dilakukan terhadap AVL Tree pada prinsipnya sama dengan
operasi terhadap BST, kecuali diperlukan operasi penyeimbangan jika pohon yang
terbentuk tidak seimbang sesuai dengan aturan diatas. Penambahan data atau
penghapusan data dari (terhadap) pohon yang seimbang dapat mengakibatkan pohon
tersebut menjadi tidak seimbang. Contoh berikut menunjukkan bagaimana pohon AVL
berubah menjadi bukan AVL setelah masuknya data baru, serta pohon AVL berubah
menjadi bukan AVL jika salah data yang di hapus.
Misalkan kedalam pohon pada gambar 4.12 di atas di sisipkan angka 17 (ke
sebelah kana dari 13). Hal ini mengakibatkan factor keseimbangan pada akar menjadi
+2 seperti gambar 4.13 berikut ini:
• A
• 3 +2 •
• 2 0 • • 11 +1 •
• 7 +2 • • 13 0 •
• 17 +2 •
Gambar 4.13 pohon tidak seimbang setelah 17 masuk kedalam pohon gambar 4.12
Pohon pada gambar 4.13 diatas berat ke kanan dan tidak seimbang pada
node 3 (akar). Pohon tersebut di seimbangkan dengan cara sebagai berikut:
1. Gantikan akar dengan 7 dan kemudian node 3 menjadi cabang kiri dari 7
sehingga di peroleh gambar 4.14 berikut ini:
• A
• 7 +1 •
• 3 -1 • • 11 +2 •
• 7 0 •
• 13 +1 •
• 17 +2 •
Gambar 4.14 pohon setelah terjadi pergeseran terhadap pohon gambar 4.1
•
A
• 7 0 •
• 3 -1 • • 13 0 •
• 7 0 • • 17 +1 • • 17 +2 •
Contoh 2 :AVL berubah menjadi bukan AVL akibat penghapusan data. Misalnya kita
gunakan kembali pohon pada gambar 4.12 di atas, kemudian dilakukan hapus terhadap
data 2, sehingga di peroleh pohon seperti gambar 4.16 berikut ini:
• A
• 3 +2 •
• 1 0 •
• 7 0 • • 13 0 •
Pada gambar 4.16 terjadi ketidak seimbangan pada node akar, lalu dilakukan
penyeimbangan dengan cara menggantikan akar menjadi 7, kemudian 3 menjadi anak
kiri dari 7, sehingga di peroleh pohon seperti gambar 4.17 berikut ini:
A
•
• 7 +1 •
• 7 0 • • 11 0 •
1. Procedure Insert
Begin
Begin
New(T) ;
T^.kiri:=Nil;
T^.Data:=x;
T^.kanan:=Nil;
End
Insert(x,T^.kanan)
End;
2. Procedure Delete
Var
Bantu:pointer;
Begin
If T = Nil then
Else
(* x di temukan *)
Begin
Bantu= T;
T:=Nil;
Dispose(bantu);
End
Else if (T^.kanan = Nil) then (* x berada pada node dimana kirinya nil *)
Begin
Bantu = T;
End
Else if (T^.kanan = Nil) then (* x berada pada node dimana kanannya nil *)
Begin
Bantu = T;
End;
3. Procedure Tampil(cetak)
Procedure tampil(T);
Var
Pilih:integer;
Begin
Writeln;
Writeln(‘ masukkan pilihan : ‘);readln(pilih);
If (pilih = 1) then
Inorder(T)
Preorder(T)
Else
Postorder(T);
Readln;
End;
Program utuh:
uses wincrt;
type
pointer=^cell;
cell=record
kiri:pointer;
info:char;
kanan:pointer;
end;
bst=pointer;
stack=^estack;
estack=record
isi:bst;
next:stack;
end;
t:=nil;initial:=t;
end;
function empty(t:bst):boolean;
begin
empty:=(t=nil);
end;
begin
new(t);
t^.kiri:=nil;
t^.info:=x;
t^.kanan:=nil;
end
else begin
end;
end;
begin
if empty(t) then
member:=false
member:=true
else if x<t^.info then
member:=member(x, t^.kiri)
else
member:=member(x, t^.kanan);
end;
begin
if t^.kiri=nil then
begin
deletemin:=t^.info;
t:=t^.kanan;
end
else
deletemin:=deletemin(t^.kiri)
end;
var bantu:pointer;
begin
if empty(t) then
else begin
delete(x,t^.kiri)
delete(x,t^.kanan)
begin
bantu:=t;
t:=nil;
dispose(bantu)
end
begin
bantu:=t;
t:=t^.kanan;
bantu^.kanan:=nil;
dispose(bantu);
end
begin
bantu:=t;
t:=t^.kiri;
bantu^.kiri:=nil;
dispose(bantu);
end
t^.info:=deletemin(t^.kanan)
end
end;
var
baru:stack;
begin
new(baru);
baru^.isi:=dt;
baru^.next:=s;
s:=baru
end;
var b:stack;
begin
if s<>nil then
begin
b:=s;
dt:=s^.isi;
s:=s^.next;
dispose(b)
end
end;
procedure majustack(s:stack);
begin
while s<>nil do
begin
s:=s^.next
end;
end;
procedure preorderit(t:bst);
var
s:stack;
p:bst;
begin
clrscr;
if empty(t) then
else begin
s:=nil;
push(s,t);
while s<>nil do
begin
majustack(s);
pop(s,p);
while p<>nil do
begin
write(p^.info:5);
begin
push(s,p^.kanan);
majustack(s)
end;
p:=p^.kiri;
end
end;
end;
readln;
end;
procedure inorderit(t:bst);
var
s:stack;
p,Q:bst;
begin
clrscr;
if empty(t) then
else begin
s:=nil;
p:=t;
Q:=t^.kanan;
repeat
while Q<>nil do
begin
push(s,p);
p:=p^.kiri
end;
pop(s,p);
write(p^.info:5);
p:=p^.kanan;
push(s,p);
until s=nil
end;
readln;
end;
procedure postorderit(t:bst);
var
s:stack;
p,Q:bst;
begin
clrscr;
if empty(t) then
else begin
s:=nil;
p:=t;
Q:=t^.kanan;
repeat
while p<>nil do
begin
push(s,p);
p:=p^.kiri
end;
pop(s,p);
write(p^.info:5);
p:=p^.kanan;
push(s,p);
until s=nil
end;
readln;
end;
procedure preorder(t:bst);
begin
clrscr;
if t<>nil then
begin
write(t^.info:5);
preorder(t^.kiri);
preorder(t^.kanan);
end;
readln;
end;
procedure inorder(t:bst);
begin
clrscr;
if t<>nil then
begin
inorder(t^.kiri);
write(t^.info:5);
inorder(t^.kanan);
end;
readln;
end;
procedure postorder(t:bst);
begin
clrscr;
if t<>nil then
begin
postorder(t^.kiri);
postorder(t^.kanan);
write(t^.info:5);
end;
readln;
end;
var
t:bst;
y:char;
x:boolean;
pil:integer;
begin
repeat
gotoxy(10,5);
clrscr;
writeln;
case pil of
1: t:=initial(t);
2: begin
clrscr;
insert(y,t);
end;
3: begin
clrscr;
delete(y,t);
end;
4: begin
clrscr;
if member(y,t)=true then
end;
5: preorderit(t);
6: inorderit (t);
7: postorderit (t);
8: preorder (t);
9: inorder(t);
10:postorder (t);
end;
until pil=0;
clrscr;
gotoxy(25,10);
gotoxy(25,12);
end.