Anda di halaman 1dari 9

7.8.

Pohon AVL

51

7.8

Pohon AVL

Cara penyimpanan data yang berurutan dapat dilakukan dengan menggunakan list atau linked-list. Kelemahan pencarian dengan metode ini adalah waktu pencarian yang dibutuhkan lebih panjang, karena pencarian harus dilakukan secara berurutan. Untuk mendapatkan metode pencarian yang lebih cepat, digunakan struktur data bertipe pohon. Pada struktur data pohon, suatu simpul diletakkan sebagai anak kiri jika datanya lebih kecil daripada data pada akar, dan diletakkan sebagai anakl kanan jika datanya lebih besar daripada data akar. Pengoptimalan pohon semacam ini dapat dilakukan dengan membentuk suatu pohon biner yang seimbang. Pohon Biner Seimbang Sempurna (Perfectly Balanced) adalah pohon biner dengan setiap simpulnya mempunyai jumlah simpul cabang kiri dan kanannya berselisih maksimum 1. Di dalam implementasinya, dikenal istilah Pohon Telusur, yaitu pohon biner yang: setiap simpulnya mempunyai sebuah kunci setiap simpul diatur sedemikian rupa sehingga simpul yang mempunyai kunci lebih kecil diletakkanb di sebelah kiri, sedang untuk kunci yang lebih besar diletakkan di sebelah kanan. Dengan berdasar pada pengertian mengenai pohon biner seimbang sempurna dan pohon telusur, maka dikenal istilah pohon AVL, (dari nama Adelson, Velski dan Landis), yaitu: Pohon biner telusur yang setiap simpul sub-pohon kiri dan sub-pohon kanannya mempunyai sifat bahwa perbedaan tinggi antara sub-pohon kiri dan sub-pohon kanannya maksimum adalah 1. Jika suatu simpul ditambahkan ataupun dihapus dari suatu pohon biner AVL, maka perlu dilakukan penyeimbangan supaya pohon biner biner tersebut tetap merupakan pohon biner AVL. Dalam hal ini, pemeriksaan keseimbangan selalu dilakukan setiap kali selesai suatu penyisipan atau penghapusan simpul. Pada saat pemeriksaan simpul yang dibandingkan dengan simpul yang disisipkan dianggap sebagai akar. Seandainya telah terdapat daftar simpul (node) berurutan, yaitu suatu le record dengan kunci abjad. Jika simpul-simpul ini akan dipakai untuk mencari informasi, menambah simpul, atau membuat perubahan lain, maka daftar / le tadi dibuat menjadi suatu pohon telusur biner. Hal ini bisa dimulai dengan suatu pohon biner kosong dan dipakai algoritma penyisipan pohon untuk penyisipan simpulnya. Tetapi karena simpul tadi sudah berurutan, maka pohon telusurnya akan berupa rantai panjang, sehingga penelusuran sekuensial akan lebih cepat daripada penelusuran biner. Oleh karena itu, simpul-simpul tadi dibuat menjadi

52

7. Pohon Biner

suatu pohon yang serimbun mungkin untuk mengurangi waktu pembuatan dan penelusuran pohon. Untuk pohon biner dengan simpul yang kuncinya sudah berurutan diperoleh bahwa: Jika simpul-simpul suatu pohon biner yang utuh (sempurna) diberi label dalam keadaan yang tidak berurutan, maka masing-masing simpul adalah tepat sejumlah tingkatan di atas daun-daunnya sebanyak pangkat 2 tertinggi yang membagi habis labelnya. Seandainya jumlah simpul yang akan membentuk pohon tidak diketahui, yaitu jika simpul-simpul diperoleh dari suatu le atau linked-list: Bagaimana jika jumlah simpul tidak tepat 2n 1, yang mengakibatkan suatu pohon biner menjadi tidak sempurna. Oleh karena itu dibutuhkan suatu algoritme yang simetris dan dapat merapikan pohon. Simpul pertama yang datang akan menjadi daun, sehingga pointer kiri dan kanannya menjadi nil. Simpul kedua berada di atas simpul1 . Simpul2 tersambung ke simpul1 ; harus diingat di mana simpul1 berada. Simpul ketiga berupa daun, sub-pohon kanan dari simpul2 ; di sini dicatat pointer ke simpul2 . Namun demikian, tidak diperlukan untuk membuat daftar pointer-pointer untuk menentukan sambungan berikutnya. Hal ini dikarenakan jika simpul3 diterima maka semua sambungan simpul1 pasti sudah sempurna. Simpul2 harus tetap mencatat sampai simpul4 diterima, agar sambungan kiri simpul4 dapat dibuat, tetapi kemudian pointer ke simpul2 sudah dapat dihapus. Serupa dengan hal itu, simpul4 harus tetap mencatat sampai pengolahan simpul8 selesai. D B A A A B C A B C A B C P H D B F J L N R T E D

Q A C E G I K M O S U Untuk membuat sambungan berikutnya hanya perlu dicatat pointer-pointer ke salah satu simpul pada tiap tingkatan, yaitu simpul yang diproses terakhir kali pada tingkatan tersebut. Pointer-pointer ini disimpan secara array (barisan) dan disebut sebagai last-node (simpul-akhir). Misalkan suatu pohon mempunyai 20 tingkatan, maka jumlah simpulnya: 220 1 > 1000000

7.8. Pohon AVL

53

Jika suatu simpul baru datang, maka sebagai simpul terakhir yang diterima, (setidaknya untuk sementara waktu) pointer kanannya adalah nil. Pointer kiri dari simpul kiri akan = nil jika ia berupa daun, atau berupa suatu masukan di dalam last-node pada tingkat-tingkat dari simpul baru tadi. Dengan demikian, daun-daunnya dapat diperlakukan secara sama seperti simpul-simpul lain. Dianggap bahwa daun pada tingkatan 0, last-node diindeks (diurutkan) dari -1 s/d maksimum-tinggi-pohon-yang-mungkin, dan last-node[-1] = nil.

7.8.1

Penyeimbangan Pohon

Penyeimbangan Pohon merupakan salah satu perilaku pohon AVL. Berikut ini akan dibahas algoritma penyisipan dan penghapusan simpul pada suatu pohon untuk mendapatkan Pohon AVL yang seimbang. Algoritme Penyisipan Simpul Langkah-1: Setiap data, sebagai simpul, akan memiliki eld tambahan (untuk eld data (info), pointer ke kiri dan ke kanan), yaitu bf, yang didenisikan sebagai:
type b a l a n c e f a c t o r = (LH , EH, RH) ; ... bf : bal ancefacto r ;

Keterangan: LH = tinggi kiri RH = tinggi kanan EH = sama tinggi Langkah-2: Menelusuri apakah suatu penyisipan akan menambah jarak antara sub-pohon kiri dan kanan atau tidak, dengan maksud menyesuaikan balancefactor -nya. Cara penelusuran: menambahkan parameter tambahan bertipe Boolean, misal disebut: taller. Kemudian membuat prosedur untuk penyeimbangan kiri dan penyeimbangan kanan. Jika suatu penyisipan simpul baru menyebabkan bertambah tingginya salah satu sub-pohon sehingga sampai 2 lebihnya dari sub-pohon yang lain, maka syarat AVL menjadi tidak terpenuhi. Dalam hal ini berarti pohon tersebut perlu dibangun kembali untuk memperoleh kembali keseimbangannya. Metode yang dipakai adalah metode ROTASI. Anggap r = akar (root) pohon AVL x = akar sub-pohon yang lebih tinggi dari sub-pohon lain Dari kemungkinan-kemungkinan yang ada yaitu: 1. Sub-pohon kanan lebih tinggi daripada sub-pohon kiri

54 2. Sub-pohon kiri lebih tinggi daripada sub-pohon kanan 3. Sub-pohon kiri dan kanan sama tinggi,

7. Pohon Biner

maka dapat diamati proses penyeimbangan pohon AVL dengan metode rotasinya: Kemungkinan-1: Gambar 7.2 menunjukkan kemungkinan pertama, yaitu bila sub-pohon kanan lebih tinggi daripada sub-pohon kiri. r x T1 T2 T3

Gambar 7.2 Sub-pohon kanan lebih tinggi daripada sub-pohon kiri Untuk penyeimbangan dari keadaan semacam ini maka dilakukan RotasiKiri, yaitu: simpul x dirotasikan ke atas (ke akar pohon), simpul r dijatuhkan ke kiri dari simpul x. Isi sub-pohon T 2 yang terletak antara simpul r dan simpul x menjadi sub-pohon kanan dari simpul r (bukan lagi sub-pohon kiri dari simpul x). Sehingga pohonnya seperti pada Gambar 7.3. x r T1 T2 T3

Gambar 7.3 Setelah dilakukan putar kiri Kemungkinan-2: Jika sub-pohon kiri dari simpul x lebih tinggi dari sub-pohon kanan dari simpul x, maka diperlukan perpindahan 2 tingkatan ke akar subpohon kiri dari simpul x, yaitu simpul w , untuk mendapatkan akar yang baru. Bentuk pohon sebelum diputar terlihat pada Gambar 7.4. Dalam hal ini dilakukan rotasi ganda. Transformasinya diperoleh dengan dua langkah: 1. merotasi sub-pohon dengan akar simpul x ke kanan (sehingga w menjadi akar pohon)

7.8. Pohon AVL r x T1 T2 w T4 T3

55

Gambar 7.4 Penyeimbangan pohon dengan putar ganda (kanan-kiri) 2. merotasi seluruh pohon dengan akar simpul r ke kiri (mengangkat simpul w sehingga menjadi akar yang baru). Sehingga balance-factor untuk simpul r dan simpul x bergantung pada balance-factor simpul w . Lihat Gambar 7.5. w r T1 T2 T3 x T4

Gambar 7.5 Hasil putar ganda (kanan-kiri) pohon menjadi pohon AVL

Kemungkinan-3: Kemungkinan ini mustahil terjadi, karena: Suatu simpul baru pada mulanya disisipkan, sehingga mau tidak mau pasti akan ke salah satu sub-pohon (kiri atau kanan). Dengan demikian hanya salah satu subpohon saja yang bertambah tinggi. Jika sub-pohon ini tingginya sama dengan sebelum penyisipan, maka tinggi sub-pohon tidak berubah oleh penyisipan tersebut. Namun keadaan ini bertentangan dengan pembahasan yang terdahulu. Gambar 7.6 menunjukkan contoh pertumbuhan AVL saat penyisipan data.

7.8.2

Perilaku Algoritme

Jumlah pemanggilan prosedur SISIP secara rekursif untuk penyisipan simpul baru dapat sebanyak tinggi pohon tersebut. Secara sepintas kelihatannya seperti setiap pemanggilan akan melakukan rotasi tunggal atau dua kali pada sub-pohon yang sama, namun sebenarnya hanya terjadi satu kali rotasi tunggal atau ganda.

56
K,M U sebelum diputar

7. Pohon Biner
setelah diputar

K M

K M U K

M U

T,V

P sebelum diputar

setelah diputar

M K T U V P K

M U T V K M P

T U V

Gambar 7.6 Pertumbuhan pohon AVL

7.8.3

Algoritme Penghapusan Simpul

Penghapusan simpul x dari suatu pohon AVL juga membutuhkan rotasi (tunggal maupun ganda), seperti halnya pada penyisipan. Garis besar metode penghapusannya adalah sebagai berikut: Langkah-1: Persempit permasalahan pada kasus di mana simpul x yang akan dihapus mempunyai maksimal satu anak. Jika dianggap x punya 2 anak: Cari simpul y (simpul tepat sebelum x) dalam kunjungan acak. Caranya dengan mengambil anak kiri x, kemudian bergerak ke kanan sejauh mungkin untuk memperoleh y . Dengan demikian, simpul y dijamin tidak akan mempunyai anak kanan. Letakkan y pada posisi x dalam pohon (dengan akar sub-pohon, akar kiri, akar kanan, dan balance-factor yang sama dengan simpul x). Kemudian hapus simpul y dari posisi terdahulunya; caranya dengan menggunakan simpul y pada tempat simpul x di setiap langkah. Langkah-2: Hapus simpul x dari pohon. Dari Langkah-1 diketahui bahwa simpul x setidaknya mempunyai maksimal 1 anak. Simpul x dihapus dengan jalan menghubungkan akar sub-pohon simpul x ke satu-satunya anak (atau nil) simpul x. Tinggi sub-pohon dengan akar simpul x akan berkurang satu. Bagaimana perubahan ini mempengaruhi tinggi keseluruhan pohon?

7.8. Pohon AVL

57

Semua simpul kemudian diamati dari simpul x ke akar pohon. Untuk melihat berkurang atau tidaknya tinggi sub-pohon digunakan variabel Boolean, sebut saja shorter. Apa yang dilakukan terhadap tiap-tiap simpul bergantung pada harga shorter, pada simpul balance-factor atau anak simpul. Langkah-3: Variabel Boolean shorter dinisialisasi = true. Langkah-langkah berikutnya dilakukan pada setiap simpul-p pada jalur dari simpul x ke akar pohon, sehingga shorter tetap berharga true. Bila shorter = false, maka algoritmanya berhenti (dengan kata lain, tidak perlu membuat perubahan lagi). Langkah-4: Kasus I: Balance-factor simpul p = equal. balance-factor p diubah sesuai dengan sub-pohon kiri / kanan dipendekkan, sehingga shorter = false. Lihat Gambar 7.7. p = p

T1

T2

T1

T2

Gambar 7.7 Penghapusan simpul yang tidak mengubah keseimbangan Langkah-5: Kasus II: Balance-factor simpul p tidak equal, dan sub-pohon yang lebih tinggi dipendekkan. Ubah balance-factor menjadi equal, dan shorter tetap berharga true. Lihat Gambar 7.8. p T2 = p T2

T1

T1

Gambar 7.8 Penghapusan Simpul yang mengubah Tinggi pohon tetapi tidak mengubah Keseimbangannya Langkah-6: Kasus III: Balance-factor simpul p tidak equal, dan sub-pohon yang lebih pendek sudah dipendekkan, sehingga tinggi pohon AVL menjadi false di p. Buat rotasi untuk memperoleh kembali keseimbangan. Anggap simpul q sebagai akar untuk sub-pohon p (yang belum dipendekkan), sehingga sekarang terdapat 3 kasus untuk balance-factor q .

58

7. Pohon Biner

Langkah-7: Kasus III-1: Balance-factor q adalah equal. Rotasi satu kali (dengan perubahan balance-factor p dan q ) untuk memperoleh keseimbangan, dan shorter = false. Lihat Gambar 7.9. p q T1 T2 T3 T1 = p T3 T2 q

Gambar 7.9 Penghapusan dan Rotasi setelah penghapusan Simpul Langkah-8: Kasus III-2: Balance-factor q = balance-factor p. Rotasi satu kali, Balance-factor p dan q di-set menjadi sama, shorter = true. Lihat Gambar 7.10. p q T1 T2 T1 = p T2 T3 q

T3

Gambar 7.10 Penghapusan, rotasi kiri, dan tinggi berkurang Langkah-9: Kasus III-3: Balance-factor p dan q berlawanan. Rotasi dilakukan dua kali (ganda), yaitu sekeliling q lebih dahulu, kemudian sekeliling p, balance-factor akar yang baru di-set menjadi sama dan balance-factor yang lainnya menyesuaikan, shorter = true. Pada keadaan III-1 s/d III-3, arah rotasi bergantung pada sub-pohon kiri/kanan yang dipendekkan (akibat penghapusan suatu simpul). Lihat Gambar 7.11.

7.8. Pohon AVL

59

p r T1 T2 q T4 T3

= p T1 T2

q r T3 T4

Gambar 7.11 Penghapusan dan rotasi ganda

Anda mungkin juga menyukai