22
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.

Penyeimbangan Tree

Embed Size (px)

DESCRIPTION

Tugas Dr Bpk. Drs.Lamhot Sitorus

Citation preview

Page 1: Penyeimbangan Tree

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

Page 2: Penyeimbangan Tree

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.

Page 3: Penyeimbangan Tree

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

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

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:

7 +1 2 0

11 0

7 0

3 0 11 0

Page 4: Penyeimbangan Tree

11 -3

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

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:

7 -2

2 +1

3 0

2 +1

7 0 1 0

11 0 3 0

Page 5: Penyeimbangan Tree

A

Gambar 4.11 pohon A pada gambar 4.7 di masukkan 13

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 7 +2

11 +1

13 0

3 +2

2 0 11 +1

Page 6: Penyeimbangan Tree

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

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:

13 0 7 +2

3 +2

2 0 11 +1

13 0 7 +2

17 +2

Page 7: Penyeimbangan Tree

1. Gantikan akar dengan 7 dan kemudian node 3 menjadi cabang kiri dari 7 sehingga di peroleh gambar 4.14 berikut ini:

A

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 +1

3 -1 11 +2

13 +1 7 0

17 +2

7 0

13 0

3 -1

Page 8: Penyeimbangan Tree

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

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:

7 +1

17 +1 17 +2 7 0

1 0

7 0 13 0

11 0 7 0

Page 9: Penyeimbangan Tree

Gambar 4.17 pohon AVL setelah di seimbangkan

PROCEDURE YANG DI BUTUHKAN

1. Procedure InsertProcedure 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;

EndElse 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 DeleteProcedure 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

13 0

Page 10: Penyeimbangan Tree

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);EndElse if (T^.kanan = Nil) then (* x berada pada node dimana kirinya nil *)BeginBantu = T;T: T^.kana: (* set T=pointer kanannya * )

Bantu^.kanan:= Nil (* putuskan hubungan node dengan kanannya *)Dispose (bantu) (* lepaskan Node berisei x *)EndElse 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

Page 11: Penyeimbangan Tree

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

Page 12: Penyeimbangan Tree

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;

Page 13: Penyeimbangan Tree

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) endend;procedure majustack(s:stack);beginwhile s<>nil do begin s:=s^.next end;end;procedure preorderit(t:bst);var s:stack;

Page 14: Penyeimbangan Tree

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

Page 15: Penyeimbangan Tree

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

Page 16: Penyeimbangan Tree

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;vart:bst;

y:char;x:boolean;pil:integer;beginrepeat 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 ');

Page 17: Penyeimbangan Tree

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 of1: 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 ');

Page 18: Penyeimbangan Tree

gotoxy(25,12);write('tekan enter untuk kembali ke program ');readln;end.