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