download

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 (pdata_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.
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();
} // 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 == pdata_l)
if (pdata_r != INT_MAX) {
pdata_l = pdata_r;
pdadta_r = INT_MAX; }
else
pdata_l = INT_MAX;
else
pdata_r = INT_MAX;
// p 3-node
// p 2-node
// terus ?
//x = pdata_r
40
Contoh Fungsi-fungsi Delete (2)
/* 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
r
80
p
q
95
41
Contoh Fungsi-fungsi Delete (3)
/* 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;
}
42