• Tidak ada hasil yang ditemukan

POHON PENCARIAN BINER (BINARY SEARCH TREE, BST)

7.1 Pendahuluan

Setiap elemen senarai menunjuk ke satu elemen berikutnya, pada struktur data BST, setiap elemen (elemen BST sering disebut simpul) menunjuk ke dua simpul lainnya, yaitu menunjuk ke simpul yang mendahului (disebut simpul

“kiri”) dan ke simpul yang mengikutinya (disebut simpul “kanan”). Simpul kiri menyimpan nilai informasi yang lebih kecil dibanding simpul yang menunjuk, sedang simpul kanan menyimpan nilai informasi lebih besar dibanding simpul yang menunjuknya.

1 2 3 . . . 9 10

Gambar 7.1. Senarai dengan 10 elemen

Gambar 1 menunjukkan senarai denga 10 elemen. Gambar 7.2 adalah BST yang dibangun dari elemen senarai pada Gambar 7.1.

Perhatikan bahwa elemen sebelah kiri dari suatu elemen menyimpan nilai informasi yang lebih kecil dan elemen sebelah kanan menyimpan informasi yang lebih besar. Seperti pada senarai, alamat elemen pertama BST disimpan pada penunjuk eksternal. Pada kuliah ini, alamat elemen pertama BST diberi nama Akar. Akses terhadap BST dilakukan melalui Akar.

Mengacu ke Gambar 7.2, untuk mengakses simpul yang menyimpan nilai informasi 10, kita harus melalui Akar. Nilai yang tersimpan di Akar, Info (Akar)

< 10, sehingga sesuai dengan aturan bahwa simpul yang menyimpan nilai informasi lebih besar selalu terletak di sebelah kanan, maka untuk menemukan 10 kita harus menelusuri sebelah kanan dari Akar, kemudian bandingkan lagi nilainya dengan 10, masih lebih kecil, sehingga kita ke kanan lagi dst., sampai kita tiba di simpul yang menyimpan informasi 10. Jadi untuk menemukan 10 hanya diperlukan 4 kali pembandingan. Bandingkan dengan senarai, untuk menemukan 10 harus dilakukan 10 kali pembandingan.

8

2

5

3

4 6 9

7 10

1

Level 0

Level 1

Level 2

Level 3 Akar

Gambar 7.2. BST dengan 10 simpul 7.2 Hubungan Antar Simpul Pada BST

Gambar 2 menunjukkan hubungan antar simpul pada BST. Ada 10 simpul pada Gambar 2. Setiap BST memiliki simpul pertama yang unik disebut Akar. Akar dapat memiliki simpul di kirinya disebut anak kiri dan simpul di kanannya disebut anak kanan. Simpul yang tidak memiliki anak disebut simpul daun.

Simpul daun pada Gambar 2 adalah 1, 4, 7 dan 10.

Dua simpul disebut bersaudara jika induknya sama. Sebuah simpul adalah ancestor dari suatu simpul jika merupakan induk dari simpul. Jadi Akar adalah ancestor dari semua simpul lain pada BST. Sebuah simpul adalah descendant dari suatu simpul jika merupakan anak dari simpul. Descendant kiri dari suatu simpul disebut sub pohon kiri dan descendant kanan disebut sub pohon kanan.

Level dari suatu simpul menunjukkan jaraknya dari Akar. Level Akar adalah 0.

Jumlah maksimum simpul pada level N adalah 2N.

Tinggi pohon adalah maksimum level + 1. Tinggi pohon pada Gambar 2 adalah 4.

Deklarasi BST adalah sebagai berikut:

type TInfo = integer {atau tipe terdefinisi lainnya}

type BST = pointer to Simpul

type Simpul = record <Info: TInfo, Kiri: BST, Kanan: BST>

Akar: BST

Algoritma 7.1 Deklarasi BST

Akses ke semua simpul BST dimulai dari Akar. Jika P bertipe BST, maka:

 Info(P) adalah mengakses informasi yang disimpan di simpul yang alamatnya P

 Kiri(P) adalah pointer ke kiri dari simpul yang alamatnya P

 Kanan(P) adalah pointer ke kanan dari simpul yang alamatnya P Operasi Terhadap BST

Operasi sering dilakukan terhadap BST adalah:

 Menciptakan BST kosong, Create

 Penelusuran BST, ada 3 cara yaitu inorder, preorder dan postorder

 Pencarian informasi tertentu pada BST, SearchBST

 Penyisipan simpul, InsertBST

 Penghapusan simpul, DeleteBST

 Menghitung jumlah simpul

 Menghitung tinggi pohon

 Menghitung simpul daun 7.3 Membuat BST Kosong

procedure Create(output Akar: BST) {membuat BST kosong}

Algoritma 7.2. Membuat BST Kosong 7.4 Penelusuran BST

Penelusuran secara inorder

Penelusuran inorder adalah kiri, akar, kanan

procedure InOrder(input Akar: BST) {menelusuri BST secara inorder}

{K. Awal: Akar terdefinisi }

{K.Akhir: semua simpul dikunjungi secara inorder}

Deklarasi:

Algoritma 7.3. Penelusuran Inorder

Penelusuran secara preorder

Penelusuran preorder adalah akar, kiri, kanan procedure PreOrder(input Akar: BST) {menelusuri BST secara preorder}

{K. Awal: Akar terdefinisi }

{K.Akhir: semua simpul dikunjungi secara preorder}

Deklarasi:

Deskripsi:

if Akar ≠ Nil then Proses(Info(Akar)) PreOrder(Kiri(Akar)) PreOrder(Kanan(Akar)) endif

Algoritma 7.4. Penelusuran Preorder Penelusuran secara postorder

Penelusuran postorder adalah kiri, kanan, akar procedure PostOrder(input Akar: BST) {menelusuri BST secara postorder}

{K. Awal: Akar terdefinisi }

{K.Akhir: semua simpul dikunjungi secara postorder}

Deklarasi:

Deskripsi:

if Akar ≠ Nil then PostOrder(Kiri(Akar)) PostOrder(Kanan(Akar)) Proses(Info(Akar)) endif

Algoritma 7.5. Penelusuran Postorder

7.5 Pencarian

Mencari keberadaan X di dalam BST

procedure SearchBST(input Akar: BST, input X: TInfo, output Found: boolean )

{mencari keberadaan X di dalam BST}

{K. Awal: Akar terdefinisi, X terdefinisi } {K.Akhir: Jika X ditemukan maka Found = true

Jika X tidak ditemukan maka Found = false}

Algoritma 7.6. Pencarian Pada BST 7.6 Menyisipkan Elemen

Elemen baru selalu disisipkan sebagai elemen daun. Penyisipan elemen pada BST harus mengikuti aturan dasar bahwa info sebelah kiri selalu lebih kecil dari info induk dan info sebelah kanan lebih besar dari info induk.

procedure InsertBST(input/output Akar: BST, input X: TInfo) {menyisipkan X ke dalam BST}

{K. Awal: Akar terdefinisi, X terdefinisi } {K.Akhir: X menjadi elemen daun}

Deklarasi:

InsertBST(Kanan(Akar),X) else

if Info(Akar)> X then InsertBST(Kiri(Akar),X) else

write(X, “sudah ada”) endif

endif endif

Algoritma 7.7 Penyisipan Elemen BST 7.7 Menghapus Elemen

Operasi lain yang berguna dalam pemeliharaan BST adalah menghapus elemen tertentu. Menghapus tidak sesederhana menyisipkan simpul. Menghapus simpul daun lebih sederhana daripada menghapus simpul akar. Secara garis besar ada tiga kasus proses menghapus simpul BST, yaitu:

1. Menghapus simpul daun (simpul yang tidak punya anak), dapat dilakukan dengan me-Nil-kan Kiri atau Kanan induk simpul tersebut. Perhatikan Gambar 3.

Induk X K. Awal

X

Induk X K. Akhir

X

Dihapus

Gambar 7.3. Menghapus Simpul Daun

2. Menghapus simpul yang memiliki satu anak atau satu sub pohon. Jika P adalah alamat simpul yang dihapus, maka pointer orang tua dari P diisi dengan pointer anak. Gambar 4.

Induk

Gambar 7.4. Menghapus simpul yang memiliki satu sub pohon 3. Menghapus elemen yang memiliki dua anak. Kasus ini paling sulit. Ada dua

cara untuk menyelesaikan penghapusan:

a. Simpul yang dihapus diganti dengan simpul paling kanan (terbesar) dari sub pohon kiri, atau

b. Simpul yang dihapus diganti dengan simpul paling kiri (terkecil) dari sub pohon kanan.

Misalkan digunakan pilihan (a), maka cara untuk menghapus simpul adalah:

 Cari simpul terbesar di sub pohon kiri dari simpul yang dihapus

 Ganti info simpul yang dihapus dengan simpul maksimum

 Hapus simpul maksimum dengan cara menghapus simpul daun Perhatikan Gambar 7.5.

Gambar 7.5 Menghapus simpul yang memiliki dua sub pohon

procedure DeleteBST(input/output Akar: BST, input X: TInfo, output Found: boolean)

{menghapus simpul BST yang info-nya = X}

{K. Awal: BST terdefinisi, tidak kosong}

{K.Akhir: Jika X ada maka simpul yang info-nya = X dihapus dari BST dan Found = true. Jika X tidak ada maka Found = false}

Deklarasi:

Temp: BST

function Maks(input Akar: BST)BST

{mengembalikan alamat simpul maksimum pada BST}

Deskripsi:

Algoritma 7.8. Menghapus Simpul BST

7.8 Menghitung Tinggi Pohon

function Tinggi(input Akar: BST) integer {mengembalikan tinggi BST}

Deklarasi:

t1,t2: integer Deskripsi:

if Akar = Nil then return 0

else

t1  Tinggi(Kiri(Akar)) t2  Tinggi(Kanan(Akar)) if t1 > t2 then

return t1 + 1 else

return t2 + 1 endif

endif

Algoritma 7.9. Menghitung Tinggi Pohon 7.9 Menghitung Jumlah Simpul

function JumlahSimpul(input Akar: BST) integer {mengembalikan jumlah simpul BST}

Deklarasi:

Deskripsi:

if Akar = Nil then return 0

else

return (1 + JumlahSimpul(Kiri(Akar)) + JumlahSimpul(Kanan(Akar))) endif

Algoritma 7.10. Menghitung Jumlah Simpul

7.10 Menghitung Jumlah Daun

function JumlahDaun(input Akar: BST) integer {mengembalikan tinggi BST}

Deklarasi:

t1,t2: integer Deskripsi:

if Akar = Nil then return 0

else

if (Kiri(Akar) = Nil and Kanan(Akar) = Nil) return 1

else

return JumlahDaun(Kiri(Akar)) + JumlahDaun(Kanan(Akar)) endif

endif

Algoritma 7.11. Menghitung Jumlah Daun Soal Latihan

1. Gunakan pohon berikut untuk menjawab setiap pertanyaan secara independen (jawab setiap pertanyaan berdasarkan pohon asal)

49 43

9

47 57

55 Akar

20 2

1 4 33

31

a. Berapa simpul pada pohon tersebut

b. Berapa maksimum banyaknya simpul pada level dimana 55 berada?

c. Tuliskan semua info pada simpul level 3 d. Berapa tinggi pohon?

e. Berapa simpul daun? Tuliskan yang mana saja

f. Bagaimana bentuk pohon setelah penyisipan 3 g. Bagaimana bentuk pohon setelah penyisipan 90 h. Bagaimana bentuk pohon setelah penyisipan 56 i. Bagaimana bentuk pohon setelah 55 dihapus j. Bagaimana bentuk pohon setelah 20 dihapus k. Bagaimana bentuk pohon setelah 43 dihapus l. Tuliskan semua ancestor 33

m. Tuliskan semua descendant 20

n. Bagaimana keluaran traversal postorder o. Bagaimana keluaran traversal preorder p. Bagaimana keluaran traversal inorder

2. Informasi yang tersimpan pada simpul pohon terdiri dari 3 karakter.

Bagaimana bentuk pohon jika urutan masukan adalah sebagai berikut:

fox, dog, leg, hoe, egg, pig, elf, boy, box, zoo

Asumsi: penyisipan dilakukan terhadap pohon kosong

3. Bagaimana bentuk pohon, jika sebelum dilakukan penyisipan, informasinya sudah tersusun urut?

4. Gambarkan BST jika diketahui urutan masukan sebagai berikut:

23, 10, 43, 52, 37, 58, 48

5. Buat algoritma untuk menghitung total info pada BST

6. Buat algoritma untuk menghitung banyak simpul yang info-nya bernilai genap

Dokumen terkait