Matakuliah Tahun Versi : T0026/Struktur Data : 2005 : 1/1 Pertemuan 14 2-3 Tree 1 Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu : • Mahasiswa dapat menghasilkan program modular untuk mengimplementasikan ADT 2-3 tree 2 Outline Materi • • • • • Pengertian dan kegunaan 2-3 Tree Contoh 2-3 Tree Operasi insert data 2-3 Tree Operasi delete data 2-3 tree implementasi program 2-3 tree 3 Tree 2-3 Contoh Tree 2-3 : 2-node 3-node http://www.mcgill.ca • Semua leaf pada level yang sama (balanced tree) • Elemen pada semua leaf terurut secara ascending dari kiri ke kanan • Semua node (kecuali leaf) merupakan : – 2-node : 1 node punya 1 elemen dan 2 children, atau – 3-node : 1 node punya 2 elemen dan 3 children 4 Representasi tree 2-3 yang digunakan dalam pembahasan di sini adalah : typedef two_three struct two_three { element two_three_ptr } *two_three_ptr; data_l, data_r; left_child, middle_child, right_child; Field dalam struct two_three : data_l data_r left_ch middle_ch right_ch Bentuk node : data_l data_r left_ch middle_ch right_ch 5 Organisasi Tree 2-3 Ada 3 macam bentuk organisasi dalam tree 2-3 : 1. tree 2-3 yang kosong 2. tree 2-3 yang terdiri dari satu ROOT 2node dan mempunyai 2 children, masingmasing tree 2-3 (>) 3. tree 2-3 yang terdiri dari satu ROOT 3node dan 3 children, masing-masing tree 2-3 (>) 6 2-node data_l data_r A 40 left_child B middle_child C 10 70 80 Nilai variabel node B&C? node A : Nilai data_l = elemen 40 Tidak ada elemen di data_r, nilai data_r = INT_MAX Nilai left_child = alamat node B Nilai middle_child = alamat node C Nilai right_child = NULL 7 3-node A 40 < 40 B C 10 60 40 <…< 60 50 > 60 D 70 90 Isi dari node A, B, C, D ? Node B (left_child node A) berisi elemen < data_l node A Node C (middle_child node A) berisi elemen data_l < … < data_r node A Node D (right_child node A) berisi elemen > data_r node A 8 Operasi Insert pada Tree 2-3 • Dalam tree 2-3, tidak boleh ada elemen kunci yang sama. (Misalnya dalam daftar mahasiswa, nama boleh sama tetapi NIM harus berbeda. NIM berfungsi sbg elemen kunci (key element). Elemen kunci bersifat unik. Pd pembahasan insert, elemen dianggap sbg elemen kunci) • Elemen baru diinsert pada node leaf • Setelah insert, tree harus tetap memenuhi syarat tree 2-3 9 Algoritma Insert Elemen y 1. Cari leaf yang tepat bagi y Persis dgn BST, bandingkan y dgn isi node2 pd path yang tepat, dari ROOT turun menuju leaf. • jika y sudah ada pd tree, insert gagal • jika tree masih kosong, create root baru dengan elemen y di data_l (>) • jika leaf yang tepat telah ditemukan, ada 3 kemungkinan: 2. A: Leaf hanya punya 1 elemen (data_l) (>) • • jika y > data_l : masukkan y sbg data_r (data_r = y) jika sebaliknya: geser elemen lama (data_r = data_l), dan masukkan y sbg data_l (data_l = y) 10 <http://www.aihorizon.com/>. 3. B: Leaf berisi 2 elemen (FULL) dan parent berisi 1 elemen – – – – Bandingkan ketiga elemen (2 elemen leaf dan y). Nilai tengah dimasukkan ke parent. Jika leaf adalah left_child dari parent, geser elemen parent ke kanan dan masukkan nilai tengah ke data_l parent. Pointer left_child dan middle_child pada parent harus digeser. Jika leaf adalah middle_child dari parent, masukkan nilai tengah ke data_r parent. Dua nilai terkecil dan terbesar, akan menjadi elemen pertama pada leaf yang lama dan leaf yang baru. 11 4. C: Jika leaf dan parent sudah berisi 2 elemen (FULL) − − Seperti kasus B, nilai tengah diserahkan pada parent. Karena parent sudah full, dilakukan hal yang sama menuju root hingga bertemu dgn 2-node. Jika pada path dari leaf hingga root, semua node merupakan 2-node, akan terbentuk root baru dengan elemen nilai tengah. Nilai terkecil dan terbesar akan menjadi 2 children dari root baru. “Doing a few small 2-3 trees by hand helps to understand this algorithm” 12 Contoh Insert + 10 A 10 + 80 A 10 > A A 10 + 40 C + 20 80 > 80 10 20 + 70 40 B > A C 10 20 40 B > 80 C 40 70 80 B > + 30 13 Contoh Insert (lanjutan) C 20 A D 10 30 40 B 70 + 60 80 > G 40 C F 20 A 10 D 30 70 B E 60 80 > 14 Contoh Insert 15 16 Contoh Fungsi Insert (tidak lengkap) void insert23 (two_three_ptr *t, element y) { /* t menunjuk ke ROOT, y: elemen baru */ two_three_ptr p, q, temp; if (!(*t) ) new_root (t, y, NULL); // jika tree2-3 kosong /* Isi node root: data_l = y, data_r = INT_MAX, left_child = NULL, middle_child = NULL, right_child = NULL*/ 17 else { // tree tidak kosong p = find_node (*t, y); if (p==NULL) fprintf (stderr, “The key is currently in the tree\n”); exit (1); } /*find_node mencari elemen y dalam tree. Jika y ada, p = NULL. Jika belum ada, p berisi pointer (alamat) node. Fungsi find_node menggunakan stack untuk menyimpan pointer node2 dalam path root hingga leaf. Pointer2 ini diperlukan jika terjadi split pada proses insert */ 18 q = NULL ; for ( ; ; ) { if (pdata_r.key == INT_MAX) { put_in (&p, y, q); break; } // p 2-node /* jika y > data_l, fungsi put_in insert elemen y di data_r (data_r = y), meletakkan subtree/node q di right_child., (right_child = q). Jika y < data_l, geser elemen lama (data_r = data_l), geser middle_child (middle_child = y), masukkan y (data_l = y) */ 19 else { split (p, &y, &q); if (p == *t) { new_root (t, y, q); break; } /* Input fungsi // p 3-node // split the root split adalah node p dgn 2 elemen dan y. Outputnya adalah node p, node baru q dan elemen y. pdata_l berisi elemen terkecil diantara 3 elemen. qdata_l berisi elemen terbesar. y berisi median, dan di-insert ke node parent p & q */ else p = delete(); } // else // ambil pointer parent p 20 Delete Elemen Penghapusan elemen berlawanan 1. Cari elemen yang akan dihapus 2. Jika elemen berada di leaf p a) Jika p 3-node (berisi 2 elemen) Elemen langsung dihapus, shg p hanya memiliki 1 elemen b) Jika p 2-node (berisi 1-elemen) Node parent p disebut r, dan sibling kiri/kanan p adalah q. 21 Delete Elemen (lanjutan) • Jika sibling q 3-node, dilakukan rotasi, elemen parent r diletakkan di p dan elemen q diletakkan di r • Jika sibling q 2-node, dilakukan penggabungan q dan q, sehingga jumlah children r berkurang 1 c) Jika setelah rotasi/penggabungan node parent r kosong, berarti r = root, maka node p dijadikan root baru 22 Delete Elemen (lanjutan) 3. Jika elemen yang akan dihapus tidak ada di leaf, maka elemen tsb akan digantikan elemen terbesar dari subtree kiri atau elemen terkecil dari subtree kanan yang berada di leaf. Selanjutnya penghapusan elemen di leaf akan mengikuti langkah 2. 23 Delete (1) Delete pada 3-node Delete pada 2-node sebuah node khusus yang mempunyai 1 subtree (node eksternal) : node eksternal 24 Delete (2) Kasus 1 : Node kosong setelah elemen dihapus. Sibling dan parent 2-node, sehingga harus dilakukan penggabungan (combine) 25 Delete(3) Kasus 2: Node kosong setelah elemen dihapus. Sibling 3-node dan parent 2-node, sehingga dilakukan rotasi 26 Delete(4) Kasus 3a: Node kosong mempunyai sibling 2-node dan parent 3-node. Subtree d lebih tinggi daripada subtree a, b, c. Pada kasus ini dilakukan penggabungan. 27 Delete(5) Kasus 3b: Node kosong mempunyai sibling 2-node dan parent 3-node. Subtree d lebih tinggi daripada subtree a, b, c. Pada kasus ini dilakukan penggabungan. Jika node kosong merupakan middle_child dari parentnya, dapat dilakukan penggabungan dari kiri atau dari kanan. Lihat Delete (4) dan Delete (5). 28 Delete(6) Kasus 4a dan 4b : Dilakukan rotasi, jika sibling dan parent dari node kosong merupakan 3-node 29 Delete(2) 10 20 - 70 10 20 50 80 60 70 50 80 60 - 90 90 95 10 20 - 60 90 95 10 50 80 60 20 50 95 80 95 Rotasi dilakukan jika salah satu node sibling merupakan 3-node 30 Delete(3) 20 10 - 95 80 50 95 -50 20 10 80 -10 20 20 10 50 80 80 Gabung: jika semua node sibling merupakan 2-node 31 Delete(4) 20 10 50 80 95 - 10 80 20 50 95 32 Contoh Delete (a) 33 Contoh Delete(b) 34 Contoh Delete (c) 35 Contoh Delete(d) 36 Contoh Delete (e) 37 Contoh Delete (f) 38 Delete (g) 39 Contoh Fungsi-fungsi Delete (1) /* hapus x dari leaf p */ if (x == pdata_l) if (pdata_r != INT_MAX) { pdata_l = pdata_r; pdadta_r = INT_MAX; } else pdata_l = INT_MAX; else pdata_r = INT_MAX; // p 3-node // p 2-node // terus ? //x = pdata_r 40 Contoh Fungsi-fungsi Delete (2) /* rotasi jika p anak kiri r */ pdata_l = rdata_l; rdata_l = qdata_l; qdata_l = qdata_r; qdata_r = INT_MAX; pmiddle_child = qleft_child; qleft_child; = qmiddle_child; qmiddle_child = qright_child r 80 p q 95 41 Contoh Fungsi-fungsi Delete (3) /* penggabungan jila p anak kiri dari r */ pdata_l = rdata_l; pdata_r = qdata_l; pmiddle_child = qleft_child; pright_child = qmiddle_child; if (rdata_r == INT_MAX) rdata_l = INT_MAX; else { rdata_l = rdata_r; rdata_r = INT_MAX; rmiddle_child = rright_child; } 42
© Copyright 2024 Paperzz