1 Pertemuan Tree Matakuliah: T0026/Struktur Data Tahun: 2005 Versi: 1/1
2 Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu : Mahasiswa dapat menghasilkan program modular untuk mengimplementasikan ADT 2-3 tree
3 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
4 Tree 2-3 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, atau2-node –3-node : 1 node punya 2 elemen dan 3 children3-node 2-node3-node Contoh Tree 2-3 :
5 Representasi tree 2-3 yang digunakan dalam pembahasan di sini adalah : typedef two_three*two_three_ptr; struct two_three { elementdata_l, data_r; two_three_ptr left_child, middle_child, right_child; } data_rleft_chmiddle_chdata_lright_ch Field dalam struct two_three : data_ldata_r left_chmiddle_chright_ch Bentuk node :
6 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 2- node dan mempunyai 2 children, masing- masing tree 2-3 (>)> 3.tree 2-3 yang terdiri dari satu ROOT 3- node dan 3 children, masing-masing tree 2-3 (>)>
7 2-node 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 40 left_child middle_child data_ldata_r A BC Nilai variabel node B & C ?
8 3-node Isi dari node A, B, C, D ? < 40> <…< 60 A BC 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
9 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
10 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).
11 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.
12 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”
13 Contoh Insert 10 A + 10 A C A B C A B + 20 > > > > C AB > + 30
C ABD Contoh Insert (lanjutan) A B C D E F G > >
15 Contoh Insert
16
17 void insert23 (two_three_ptr *t, element y) { /* t menunjuk ke ROOT, y: elemen baru */ two_three_ptrp, 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 */ Contoh Fungsi Insert (tidak lengkap)
18 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 m encari 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 */
19 q = NULL ; for ( ; ; ) { if (p data_r.key == INT_MAX) { / / p 2-node put_in (&p, y, q); break; } /* jika y > data_l, fungsi p ut_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) */
20 else { // p 3-node split (p, &y, &q); if (p == *t) { / / split the root new_root (t, y, q); break; } /* Input fungsi split adalah node p dgn 2 elemen dan y. Outputnya adalah node p, node baru q dan elemen y. p data_l berisi elemen terkecil diantara 3 elemen. q data_l berisi elemen terbesar. y berisi median, dan di-insert ke node parent p & q */ else p = delete(); / / ambil pointer parent p } // else
21 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.
22 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
23 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. Delete Elemen (lanjutan)
24 Delete (1) Delete pada 3-node Delete pada 2-node sebuah node khusus yang mempunyai 1 subtree (node eksternal) : node eksternal
25 Delete (2) Kasus 1 : Node kosong setelah elemen dihapus. Sibling dan parent 2-node, sehingga harus dilakukan penggabungan (combine)
26 Delete(3) Kasus 2: Node kosong setelah elemen dihapus. Sibling 3-node dan parent 2-node, sehingga dilakukan rotasi
27 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.
28 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).
29 Delete(6) Kasus 4a dan 4b : Dilakukan rotasi, jika sibling dan parent dari node kosong merupakan 3-node
30 Delete(2) Rotasi dilakukan jika salah satu node sibling merupakan 3-node - 90
31 Delete(3) Gabung: jika semua node sibling merupakan 2-node
32 Delete(4)
33 Contoh Delete (a)
34 Contoh Delete(b)
35 Contoh Delete (c)
36 Contoh Delete(d)
37 Contoh Delete (e)
38 Contoh Delete (f)
39 Delete (g)
40 Contoh Fungsi-fungsi Delete (1) /* hapus x dari leaf p */ if (x == p data_l) if (p data_r != INT_MAX) {// p 3-node p data_l = p data_r; p dadta_r = INT_MAX; } else// p 2-node p data_l = INT_MAX;// terus ? else//x = p data_r p data_r = INT_MAX;
41 /* rotasi jika p anak kiri r */ p data_l = r data_l; r data_l = q data_l; q data_l = q data_r; q data_r = INT_MAX; p middle_child = q left_child; q left_child; = q middle_child; q middle_child = q right_child Contoh Fungsi-fungsi Delete (2) p r q
42 /* penggabungan jila p anak kiri dari r */ p data_l = r data_l; p data_r = q data_l; p middle_child = q left_child; p right_child = q middle_child; if (r data_r == INT_MAX) r data_l = INT_MAX; else { r data_l = r data_r; r data_r = INT_MAX; r middle_child = r right_child; } Contoh Fungsi-fungsi Delete (3)