Modul Praktikum
10S2101 – Algoritma dan Struktur Data (Prodi S1 SI dan TE) Tree
Minggu : 10
Tujuan : Mampu membedakan karakteristik struktur data non-linier dengan struktur data linier.
Memahami konsep dasar pohon umum.
Mampu menjelaskan varian-varian struktur data pohon.
Mampu mendefinisikan dan menggambarkan skema diagram pohon pencarian biner (binary search tree).
Mampu memprogram Binary Search Tree ADT untuk aksi insert, update, search, dan delete.
Dengan kemampun memprogram Binary Search Tree ADT, mampu menulis program untuk struktur data yang lain dengan menerapkan konsep ADT.
Setoran : Kertas Jawaban dan kode program
Waktu penyetoran : 31 Oktober 2021 Pukul 22:00 WIB (paling lambat) Tempat penyetoran : E-course
Petunjuk Praktikum
Anda dapat mengerjakan praktikum ini secara berkelompok dengan maksimum 3 mahasiswa per kelompok.
Referensi
T.H. Cormen, C.E. Leiserson, R.L. Rivest and C. Stein, Introduction to Algorithm,3rd eds., MIT Press 2009.
M.A. Weiss, Data Structures and Algorithm Analysis in C, 2nd Eds., Addison-Wesley, 1997.
A.
Teori
1. Jelaskan 2 contoh penerapan struktur data pohon (tree) pada bidang yang sesuai dengan program studi anda. Jelaskan pula bagaimana struktur data tersebut mengefisiensikan operasi-operasi pada contoh tersebut.
2. Gambarkanlah skema pohon umum untuk data yang ditunjukkan oleh Tabel 1 di bawah ini. Pohon berakar pada index_key = 12:
Tabel 1: Data pohon umum
index_key child_1 child_2 child_3 child_4
1 - - - -
2 - - - -
3 - - - -
4 6 9 - -
5 8 - - -
7 - - - -
8 15 - - -
9 - - - -
10 - - - -
11 16 18 3 -
12 11 13 17 -
13 4 1 - -
14 - - - -
15 - - - -
16 - - - -
17 7 5 10 14
18 2 - - -
Tentukanlah:
a. simpul akar, b. jumlah daun,
c. simpul – simpul daun, d. sub-pohon yang ada, e. kedalaman pohon, f. tinggi pohon,
g. kedalaman dan ketinggian simpul dengan kunci pencarian (search key) = 4
h. induk, anak, ancestors, dan descendants dari simpul dengan kunci pencarian = 18.
3. Mengacu ke soal no. 2, gambarkan skematik diagram implementasi pohon umum yang efisien dengan linked list untuk pohon tersebut.
4. Jika diberikan data berikut T = {1, 0, 3, 5, 17, 6, 4}.
a) Gambarkanlah skematik diagram pohon pencarian biner (binary search tree) yang seimbang untuk data tersebut.
b) Mengacu ke poin a., gambarkan skematik diagram pohon pencarian biner yang terbentuk jika simpul dengan nilai kunci 6 dihapus.
c) Mengacu ke poin b., gambarkanlah skematik diagram pohon pencarian biner yang terbentuk jika simpul baru dengan nilai kunci 7 dimasukkan.
5. Dengan menggunakan perhitungan waktu eksekusi fungsi rekursif, hitunglah
kompleksitas fungsi Insert pada pohon pencarian biner (binary search tree) yang diasumsikan seimbang. Fungsi ini diberikan di bagian Pemrograman.
6. Ada 3 teknik yang lazim digunakan untuk melakukan pelintasan pohon (tree) dimana ketiganya diklasifikasikan ke dalam metode depth first search. Ketiga teknik tersebut adalah: pre-order, in-order, dan post-order. Jelaskanlah ketiganya.
B.
Pemrograman
Pada praktikum ini, anda menggunakan bahasa pemrograman C untuk membuat Binary Search Tree ADT, yakni sebuah pohon biner dengan karakteristik dimana elemen yang lebih kecil diletakkan pada simpul sebelah kiri dan elemen yang lebih besar diletakkan pada simpul sebelah kanan. Asumsi yang kita gunakan adalah elemen pohon unik (tidak ada elemen yang sama). Pada dasarnya anda juga dapat membuat beberapa elemen dengan nilai yang sama dan menyesuaikan kode program.
Dengan pemahaman dan keahlian pemrograman yang anda miliki, diharapkan anda dapat membuat ADT untuk varian-varian tree yang lain.
1. Pemasukan elemen pada Binary Search Tree ADT
Komponen penyusun dari Binary Search Tree ADT ditunjukkan oleh gambar di bawah ini.
a. Edit berkas berikut dan simpan sebagai fatal.h. Berkas ini merupakan antarmuka (interface) dari Binary Search Tree ADT yang berisi deklarasi dan definisi fungsi yang mencetak pesan error ke monitor.
b. Selanjutnya, edit berkas di bawah ini dan simpan sebagai binary_search_tree.h.
interface
(binary_search_tree.h fatal.h)
implementation
(binary_search_tree.c)
klien
(klien_binary_search_tree.c)
Berkas binary_search_tree.h merupakan antarmuka yang berisi deklarasi variabel dan operasi (fungsi) yang dapat dilakukan pada Binary Search Tree ADT. Simpul pada tree direpresentasikan oleh sebuah struktur: struct TreeNode. TreeNode akan didefinisikan pada berkas implementasi. Root dari pohon pencarian biner direpresentasikan oleh tipe data BinarySearchTree yang dideklarasikan sebagai pointer ke struct TreeNode.
Fungsi yang menjadi perhatian kita saat ini ini adalah fungsi Insert yang tertulis pada baris ke-10. Fungsi ini menerima 2 parameter, yakni elemen yang akan dimasukkan (ElementType X) dan root (BinarySearchTree T). Tipe kembalian adalah BinarySearchTree. Dengan kata lain, operasi Insert selalu mengembalikan root ke klien.
c. Untuk implementasi, pertama sekali anda harus mendefinisikan struktur: struct TreeNode yang merupakan representasi simpul pada tree. Edit berkas berikut dan simpan sebagai binay_search_tree.c.TreeNode merupakan struktur yang terdiri atas 3 variabel anggota (member variables), Element, Left, dan Right. Left dan Right merupakan pointer ke anak di sebelah kiri (left child) dan anak di sebelah kanan right child) dari sebuah simpul. Left dan Right bernilai NULL jika tidak ada anak yang ditunjuknya.
d. Sebelum menulis fungsi Insert, ada baiknya kita implementasi dulu fungsi MakeEmpty (lihat antarmuka binary_search_tree.h, baris ke-13). Fungsi ini
bertujuan untuk mengosongkan tree. Tambahkan fungsi MakeEmpty ke dalam berkas implementasi: binay_search_tree.c.
Anda dapat melihat bahwa pengosongan pohon dilakukan dengan mengosongkan root T dan child nya, yakni T->Left dan T->Right. Fungsi tersebut mengembalikan NULL pointer ke klien.
e. Selanjutnya, anda akan mengimplementasikan fungsi Insert. Tambahkan fungsi Insert yang ada di bawah ini ke berkas implementasi binary_search_tree.c.
f. Untuk mengambil elemen (nilai kunci atau search key) dari struktur data, anda menggunakan fungsi Retrieve (lihat antarmuka binary_search_tree.h, baris ke- 12). Tambahkan definisi fungsi tersebut ke berkas implementasi:
binay_search_tree.c.
Fungsi Retrieve terlihat sederhana. Fungsi tersebut menerima parameter P, yakni sebuah simpul pada Binary Search Tree ADT dan mengembalikan elemen simpul tersebut. P bertipe Position, yakni sebuah tipe data yang didefinisikan sebagai pointer ke struct TreeNode (lihat antarmuka binary_search_tree.h, baris ke-7).
g. Selanjutnya, anda akan membuat program klien untuk mengakses struktur data. Anda akan membuat struktur data tree yang elemen – elemennya ditunjukkan oleh gambar di bawah ini.
Kode program di bawah ini menerapkan sebuah program klien untuk mengkonstruksi tree tersebut. Edit dan simpan sebagai: klien_binary_search_tree.c.
h. Kompilasi dan jalankan program sebagai berikut:
2. Pencarian elemen dan penghapusan pada Binary Search Tree ADT.
a. Edit berkas binary_search_tree.c yang telah anda buat sebelumnya dan tambahkan kode untuk fungsi Find, FindMin, dan FindMax yang masing – masing ditunjukkan oleh kode program di bawah ini. Find adalah fungsi untuk mencari simpul berdasarkan nilai elemen sebagai kunci pencarian. Fungsi ini mengembalikan simpul bertipe Position ke fungsi yang memangil atau ke klien.
Jika simpul tidak ditemukan, Find mengembalikan NULL. FindMin merupakan fungsi untuk mencari dan mengembalikan simpul dengan elemen terkecil, sedangkan FindMax mencari dan mengembalikan simpul dengan elemen terbesar.
b. Modifikasi program klien untuk tugas – tugas berikut: mencari elemen dengan nilai 3, mencari elemen minimum dan mencari elemen maksimum seperti ditunjukkan oleh program di halaman selanjutnya.
klien_binary_search_tree.c.
c. Kompilasi dan jalankan program sebagai berikut:
d. Fungsi Delete digunakan untuk menghapus sebuah simpul pada pohon. Untuk penghapusan, ada 2 kondisi yang perlu ditangani, yakni: (1) penghapusan simpul yang memiliki 2 anak dan (2) penghapusan simpul yang memiliki 1 anak atau tidak memiliki anak. Gambar di bawah ini memberikan contoh untuk penghapusan simpul yang memiliki 1 anak. Simpul dengan elemen bernilai 4 dihapus. Ulas lagi teori untuk penghapusan yang diberikan di kelas atau pun video pembelajaran untuk ke-2 kondisi penghapusan.
e. Edit berkas binary_search_tree.c dan tambahkan fungsi Delete yang diberikan di bawah ini. Baca komentar yang diberikan pada fungsi sehingga anda dapat memahami cara menangani 2 kondisi penghapusan yang dijelaskan di poin d sebelumnya.
f. Edit berkas klien_binary_search_tree.c dan tambahkan kode berikut:
g. Kompilasi dan jalankan program sebagai berikut:
C. Tugas Pemrograman: Red-Black Tree ADT
Menggunakan teknik yang telah kita praktekkan/ tulis untuk struktur data Binary Search Tree ADT, tulislah struktur data untuk red-black tree. Red-black tree adalah yang binary search tree dengan tambahan warna (merah atau hitam) pada setiap simpul. Warna simpul beserta batasan-batasan warna, termasuk jumlah warna dalam satu lintasan, menjamin pohon pencarian biner menjadi (hampir/ approximately) seimbang. Penjelasan rinci tentang red-black tree dan algoritma untuk operasi-operasi yang legal terhadapnya dapat anda baca di referensi [1] Bab 13, halaman 309. Red-Black Tree ADT yang anda tulis minimal harus memiliki fungsi:
a. Insert
b. Rotate (left and right) c. Delete
Setoran
1. Lembar jawaban untuk tugas Bagian A: Teori
2. Kode program untuk Tugas Bagian C: Red-Black Tree ADT
Keduanya diunggah melalui link setoran materi praktikum Minggu ke-10 di ecourse.del.ac.id.