Anda di halaman 1dari 23

Kata Pengantar

Makalah ini menjelaskan tentang POHON BINER SEIMBANG


(AVL TREE) untuk membantu setiap pembaca agar mudah memahami
apa yang dimaksud dengan Ponon Biner Seimbang (AVL Tree) . Tujuan
makalah ini adalah agar pembaca memiliki gambaran umum mengenai
definisi Pohon Biner Seimbang (AVL Tree) .Semoga makalah ini dapat
bermanfaat bagi setiap pembaca di negeri tercinta ini,khususnya bagi
mereka yang ingin mendalami di bidang teknik informatika.
Penulis menyadari bahwa makalah ini tidak luput dari kesalahan dan
masih jauh dari kesempurnaan. Untuk itu penulis membuka diri untuk
segala bentuk tanggapan dan pertanyaan serta saran dari pembaca
berkaitan dengan makalah ini.
Terimakasi secara khusus ,saya sampaikan kepada dosen yang telah
menyarankan untuk menyelesaikan makalah ini sehingga dapat
mendukung saya dan pembaca pada umumnya dalam memahami suatu
materi.terima kasih untuk semua pihak yang telah memberikan dukungan
kepada saya,khususnya rekan –rekan di Universitas Katolik Santo Thomas
Sumatera Utara Fakultas Ilmu Komputer jurusan Teknik Informatika.

Medan, 27 Januari 2010


Penulis

Roy Sahala Aruan


POHON BINER SEIMBANG (ALV TREE)
I. pohon pencarian Biner Seimbang (ALV Tree)

1.1 Definisi ALV Tree

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;

Data :tipe data;

FK :shothInt;

Kanan :pointer;

End;

AVL Tree=pointer;

Deklarasi simpul diatas dapat di gambarkan seperti gambar 4.6 berikut ini:

Kiri data FK kanan

• •

Gambar 4.6 representasi simpul untuk AVL Tree


Dimana FK=jumlah level kanan-jumlah level kiri atau sebaliknya dengan
menggunakan nilai FK yang disimpan pada setiap simpul kita dapat mengetahui apakah
sebuah BST merupakan AVL Tree atau tidak.

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.

Sehingg pohon A diatas merupakan AVL Tree.pohon A diatas memiliki panjang


lintasan (IP)= 1’+2+3=8, dan IP rata-rata = 8/4=2.

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 •

Gambar 4.8 BST B yang bukan AVL Tree


Pohon B pada gambar 4.8 diatas bukan merupakan AVL Tree karena node
2(akar) memiliki FK =+2. Demikian juga jika urutan masuk kita buat 11,7,,2,3 sehingga
di peroleh pohon pencarian biner dengan bentuk seperti pada gambar 4.9 di bawah ini:

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 •

Gambar 4.10 BST B setelah di tambah 1 ke dalam BTS B pada gambar 4.


Jika terdapat pohon A pada gambar 4.7 di atas kita tambahkan data 17, maka
pohon A yang tadinya AVL akan berubah menjadi bukan AVL, seperti terlihat pada
gambar 4.11 berikut ini:

• A

• 3 +2 •

• 2 0 • • 7 +2 •

• 11 +1 •

Gambar 4.11 pohon A pada gambar 4.7 di masukkan 13 • 13 0 •

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:

1. Pointer sebelah kanan 3 buat menunjuk 11.

2. Pointer debelah kiri 11 buat menunjuk 7.

3. Pointer sebelah kanan 7 hilang.

Dengan demikian di peroleh pohon baru seperti pada gambar 4.12 berikut ini:

• A

• 3 +2 •
• 2 0 • • 11 +1 •

• 7 +2 • • 13 0 •

Gambar 4.11 BST setelah dilakukan penyeimbangan terhadap pohon sebelumnya

1.2 Operasi – Operasi AVL Tree

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.

Contoh 1. AVL menjadi bukan AVL akibat penambahan data.

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

2. Sekarang node dengan data 11 menjadi tidak seimbang, maka dilakukan


pergeseran 13 naik ke atas , 11 menjadi cabang kiri 13 sehingga di peroleh
gambar pohon seperti gambar 4.14 berikut ini:


A

• 7 0 •

• 3 -1 • • 13 0 •

• 7 0 • • 17 +1 • • 17 +2 •

Gambar 4.15 pohon yang telah seimbang

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 •

Gambar 4.16 pohon setelah hapus 2 dari gambar 4.12

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 •

Gambar 4.17 pohon AVL setelah di seimbangkan • 13 0 •

PROCEDURE YANG DI BUTUHKAN

1. Procedure Insert

Procedure insert(x:TipeData; var T:BST);

Begin

If T=Nil then (* jika di temukan T yang Nil *)

Begin

New(T) ;

T^.kiri:=Nil;

T^.Data:=x;

T^.kanan:=Nil;

End

Else if x= T^.Data then (*x sudah dalam T*)


Writeln(* error:Data tersebut sudah ada *)

Else if x<T^.Data then

Insert(x,T^.kiri) (* jika x <data yang di tunjuk T. maka sisipkan x ke


kiri*)

Else (*x> data yang di tunjuk T Sisipkan x ke kanan*)

Insert(x,T^.kanan)

End;

2. Procedure Delete

Procedure Delete (x:tipedata; var T:BST);

Var

Bantu:pointer;

Begin

If T = Nil then

Writeln(‘error :’,x,’ tidak di temukan ‘)

Else if x<T^.data then

Delete(x,T^.kiri=Nil) (* rekursif ke kiri *)

Else if x>T^.data then

Delete(x, T^.kanan) (* rekursif ke kanan *)

Else

(* x di temukan *)

If (T^.kiri=Nil And T^.kanan=Nil) then

(*kasus x adalah daun*)

Begin

Bantu= T;

T:=Nil;

Dispose(bantu);
End

Else if (T^.kanan = Nil) then (* x berada pada node dimana kirinya nil *)

Begin

Bantu = T;

T: T^.kana: (* set T=pointer kanannya * )

Bantu^.kanan:= Nil (* putuskan hubungan node dengan kanannya *)

Dispose (bantu) (* lepaskan Node berisei x *)

End

Else if (T^.kanan = Nil) then (* x berada pada node dimana kanannya nil *)

Begin

Bantu = T;

T: T^.kiri: (* set T=pointer kirinya * )

Bantu^.kiri:= Nil (* putuskan hubungan node dengan kirinya *)

Dispose (bantu) (* lepaskan Node berisei x *)

Else (* pointer kiri dan kanan T tidak kosong * )

T^. Data:= DeleteMin(T^.ka)

End;

3. Procedure Tampil(cetak)

Procedure tampil(T);

Var

Pilih:integer;

Begin

Writeln(‘ 1. Tampil secara inorder ‘);

Writeln(‘ 1. Tampil secara preorder ‘);

Writeln(‘ 1. Tampil secara postorder ‘)

Writeln;
Writeln(‘ masukkan pilihan : ‘);readln(pilih);

If (pilih = 1) then

Inorder(T)

Else if (pilih = 2) then

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;

function initial(var t:bst):pointer;


begin

t:=nil;initial:=t;

end;

function empty(t:bst):boolean;

begin

empty:=(t=nil);

end;

procedure insert(x:char;var t:bst);

begin

if t=nil then begin

new(t);

t^.kiri:=nil;

t^.info:=x;

t^.kanan:=nil;

end

else if x < t^.info then insert(x,t^.kiri)

else if x>t^.info then insert(x,t^.kanan)

else begin

writeln('data tersebut sudah ada dalam bst');

end;

end;

function member(x:char; t:bst):boolean;

begin

if empty(t) then

member:=false

else if x=t^.info then

member:=true
else if x<t^.info then

member:=member(x, t^.kiri)

else

member:=member(x, t^.kanan);

end;

function deletemin(var t:bst):char;

begin

if t^.kiri=nil then

begin

deletemin:=t^.info;

t:=t^.kanan;

end

else

deletemin:=deletemin(t^.kiri)

end;

procedure delete(x:char; var t:bst);

var bantu:pointer;

begin

if empty(t) then

writeln('error : bst kosong')

else begin

if x< t^.info then

delete(x,t^.kiri)

else if x> t^.info then

delete(x,t^.kanan)

else if ((t^.kiri=nil) and(t^.kanan=nil))then

begin
bantu:=t;

t:=nil;

dispose(bantu)

end

else if t^.kiri=nil then

begin

bantu:=t;

t:=t^.kanan;

bantu^.kanan:=nil;

dispose(bantu);

end

else if t^.kiri=nil then

begin

bantu:=t;

t:=t^.kiri;

bantu^.kiri:=nil;

dispose(bantu);

end

else (* anak kiri dan kanan ada *)

t^.info:=deletemin(t^.kanan)

end

end;

procedure push(var s:stack;dt:bst);

var

baru:stack;

begin

new(baru);
baru^.isi:=dt;

baru^.next:=s;

s:=baru

end;

procedure pop(var s:stack;var dt:bst);

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

writeln('pohon bst masih kosong ')

else begin

writeln('pohon bst dikunjungi secara preorderit dengan urutan dbg:');

s:=nil;

push(s,t);

while s<>nil do

begin

majustack(s);

pop(s,p);

while p<>nil do

begin

write(p^.info:5);

if p^.kanan <> nil then

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

writeln('pohon bst masih kosong ')

else begin

writeln('pohon bst dikunjungi secara preorderit dengan urutan dbg:');

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;

if (p=Q) and (p<>nil) then

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

writeln('pohon bst masih kosong ')

else begin

writeln('pohon bst dikunjungi secara preorderit dengan urutan dbg:');

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;

if (p=Q) and (p<>nil) then

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('pohon pencarian biner seimbang dalam(bst) :');

writeln;

gotoxy(20,8);writeln ('menu pilihan');

gotoxy(15,9);writeln ('1. mengosongkan/menciptakan bst ');

gotoxy(15,10);writeln('2. mengisipkan data dalam bst ');

gotoxy(15,11);writeln('3. menghapus data dari dalam bst ');

gotoxy(15,12);writeln('4. mencari ke dalam bst ');

gotoxy(15,13);writeln('5. menampilkan isi bst dengan preorder cara iteratif


');

gotoxy(15,14);writeln('6. menampilkan isi bst dengan inorder cara iteratif ');


gotoxy(15,15);writeln('7. menampilkan isi bst dengan postorder cara iteratif
');

gotoxy(15,16);writeln('8. menampilkan isi bst dengan preorder cara rekursif


');

gotoxy(15,17);writeln('9. menampilkan isi bst dengan preorder cara rekursif


');

gotoxy(15,18);writeln('10. menampilkan isi bst dengan preorder cara rekursif


');

gotoxy(15,21);writeln('0. selesai.......................................... ');

gotoxy(15,22);write(' masukkan pilihan anda :');readln(pil);

case pil of

1: t:=initial(t);

2: begin

clrscr;

write('masukkan data yang ingin disisipkan :');readln(y);

insert(y,t);

end;

3: begin

clrscr;

write('masukkan data yang ingin dihapus :');readln(y);

delete(y,t);

end;

4: begin

clrscr;

write('masukkan data yang ingin di cari :');readln(y);

if member(y,t)=true then

writeln(y,' ada dalam bst');readkey

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);

writeln('terima kasih ');

gotoxy(25,12);

write('tekan enter untuk kembali ke program ');readln;

end.

Anda mungkin juga menyukai