LANDASAN TEORI
2.1
dalam
aplikasi sehari-hari. Contoh aplikasi pohon yang dapat kita lihat sehari-hari adalah pengelolaan
file dalam direktori penyimpanan.
Tree sebagai struktur data non linear mempunyai dua sifat penting, yaitu
terhubung dan tidak mengandung sirkuit. Pada Gambar 2.1, hanya G1 dan G2 yang tree,
sedangkan G3 dan G4 bukan tree. G3 bukan tree karena ia mengandung sirkuit a, d, f, a,
sedangkan G4 bukan tree karena ia tidak terhubung (dalam hal ini sisi (a, f) dan sisi (b,
e) karena titik silangnya bukan menyatakan simpul).
Sebuah tree dapat mempunyai hanya sebuah simpul tanpa sebuah sisi pun.
Dengan kata lain, jika G = (V, E) adalah tree, maka V tidak boleh berupa himpunan
kosong, namun E boleh kosong. Pada sebagian literatur, tree yang dikategorikan tree pada
gambar 2.1 disebut juga free tree (pohon bebas). Untuk membedakannya dengan rooted
tree (pohon berakar), maka rooted tree akan kita bahas lebih lanjut.
Tree juga seringkali didefinisikan sebagai graf tak-berarah dengan sifat bahwa
hanya terdapat sebuah lintasan unik antara setiap pasang simpul. Tinjau kembali graf G1
pada Gambar 2.1. Setiap simpul di G1 terhubung dengan lintasan tunggal. Sebagai
contoh, dari b ke f hanya ada satu lintasan, yaitu b, a, d, f. Dari c ke a hanya ada satu
lintasan, yaitu c, d, e. Demikian juga untuk setiap pasang simpul manapun di G1. Selain
itu, kita juga melihat bahwa di dalam tree, jumlah sisinya adalah jumlah simpul dikurangi
satu. Tinjau G1 pada Gambar 2.1, jumlah simpul = 6 dan jumlah sisi = 5 (yaitu 6 1).
2.1.1
elemen yang disebut dengan node / vertex (simpul) dimana salah satu node disebut
dengan root (akar), dan sisa node lain terpecah menjadi himpunan yang saling tidak
berhubungan satu sama lain dan disebut dengan subtree / subtreees (pohon bagian). Jika
kita melihat pada setiap subtree maka subtree juga mempunyai root dari subtree-nya
masing masing.
Dengan melihat istilah dasar di atas, maka sebuah tree secara rekursif dapat
didefenisikan sebagai berikut :
1.
2.
Jika terdapat sebuah node N dan beberapa subtree N1, N2, N3, , Nk maka
dari node N dan subtree yang ada kita bisa membentuk sebuah tree yang
mempunyai root pada node N.
N
1
Level
A
Seperti yang terlihat pada gambar 2.4 di atas, sebenarnya yang disebut dengan
node itu adalah bagian dari tree yang berisikan data / informasi dan penunjuk
percabangan. Tree pada gambar 2.4 berisi 15 node yang berisikan informasi berupa huruf
A, B, C, D hingga huruf O lengkap dengan percabangannya masing masing, dimana
tree ini mempunyai root pada node A.
Hubungan antara satu node dengan node lain bisa dianalogikan seperti halnya
dalam sebuah keluarga, yaitu ada anak, bapak, saudara, dan lain lain. Dalam gambar 2.4
node A adalah bapak dari node B dan C, dengan demikian node B dan C ini bersaudara.
Node D dan E adalah anak dari node B. Node C adalah paman dari node D dan E.
Level (tingkatan) suatu node ditentukan dengan pertama kali menentukan root
sebagai tingkat pertama. Jika suatu node dinyatakan sebagai tingkat N, maka node yang
merupakan anaknya dikatakan berada dalam tingkat N + 1. Gambar 2.4 menunjukkan
contoh tree lengkap dengan level pada setiap node. Di samping defenisi di atas, ada juga
beberapa buku yang menyebutkan bahwa root dinyatakan sebagai level 0 dan node lain
dinyatakan mempunyai level 1 tingkat lebih tinggi dari root.
Selain level, juga dikenal dengan istilah degree (derajat) dari suatu node. Degree
suatu node dinyatakan sebagai banyaknya anak atau turunan dari node tersebut. Sebagai
contoh dalam gambar 2.4 node A mempunyai degree 2, node B mempunyai degree 2, dan
2.1.2
banyak digunakan dan paling mudah seperti ditunjukkan pada gambar 2.4. Kedua dengan
menggunakan Diagram Venn. Gambar 2.5 menunjukkan bentuk Diagram Venn dari tree
pada gambar 2.4.
A
B
E
I
H
K
Ketiga adalah dengan menggunakan notasi kurung. Dengan notasi kurung tree pada
gambar 2.4 bisa disajikan sebagai berikut :
(A ( B( D ( I ), E ( J, K ) ), C ( F, G ( L, M ( N, O ) ), H ) ) )
Keempat dengan menggunakan notasi tingkat. Notasi tingkat dari tree gambar 2.4
ditunjukkan pada gambar 2.7.
A
B
D
I
E
J
K
C
F
G
L
M
N
O
B
D
garis. Contoh tree dari gambar 2.4 dengan notasi tingkat sebagai berikut:
F
G
L
M
N
O
H
2.2
Klasifikasi Tree
Pada umumnya tree dapat dibagi menjadi beberapa jenis, seperti binary tree, BST
(Binary Search Tree), AVL (Adelson Velskii and Landis) Tree, IPR (Internal Path
Reduction) Tree, heap tree, red black tree, 2 3 Tree, B Tree, dan lain - lain.
Dari antara beberapa jenis tree yang disebutkan di atas, penulis dalam tugas akhir
ini hanya membahas mengenai binary tree, BST, AVL Tree, IPR Tree, 2 3 Tree, dan B
Tree. Dengan alasan, adanya kemiripan beberapa prilaku dari tree tersebut dengan BTree.
2.2.1
Binary Tree
Binary Tree (pohon biner) bisa didefenisikan sebagai suatu kumpulan node yang
mungkin kosong atau mempunyai root dan paling banyak dua subtree (anak) yang saling
terpisah yang disebut dengan left subtree (pohon bagian kiri / anak kiri / cabang kiri) dan
right subtree (pohon bagian kanan / anak kanan / cabang kanan). Subtree bisa disebut
juga dengan istilah branch (cabang).
Binary tree merupakan tipe yang sangat penting dari struktur data tree, dan
banyak dijumpai dalam berbagai terapan. Lebih lanjut, dalam binary tree akan dibedakan
antara left subtree dengan right subtree, sementara dalam struktur tree secara umum
urutan ini tidak penting. Jadi binary tree merupakan bentuk tree yang beraturan.
Karakteristik lain adalah bahwa dalam binary tree dimungkinkan tidak mempunyai node.
A
Gambar 2.8 menunjukkkan contoh suatu binary tree.
C
Pengertian leaf, parent, child, level, dan degree yang berlaku dalam tree juga
berlaku dalam binary tree. Selain defenisi yang telah ada, dalam binary tree juga dikenal
istilah complete binary tree (pohon biner lengkap) level N, yang didefenisikan sebagai
sembarang binary tree dimana semua leaf nya terdapat pada level N dan semua node
yang mempunyai level lebih kecil dari N selalu mempunyai left subtree dan right subtree.
Level
Gambar 2.9 berikut ini merupakan
contoh complete binary tree level 4, tetapi
A
1
bukan complete binary tree level 5.
B
Selain istilah complete binary tree, juga ada istilah skewed binary tree (pohon
biner miring), yaitu suatu binary tree yang banyaknya node dalam left subtree tidak
seimbang dengan banyaknya node dalam right subtree. Gambar 2.10 menunjukkan right
dan left skewed binary tree.
a.
b.
Gambar 2.10 Contoh skewed binary tree (a) Skewed left (b) Skewed right
(N-1)
i=1
(i-1)
= 2 N 1
Dengan demikian untuk complete binary tree level 5, banyaknya leaf adalah 16
buah dan banyaknya node yang bukan leaf, termasuk root, adalah 15 buah.
2.2.1.1 Representasi Binary Tree (representasi pohon biner)
Pohon biner dapat disimpan (direpresentasikan) dengan array ataupun pointer
dimana masing-masing representasi memiliki kelebihan dan kekurangan.
a.
berikut :
a. Akar (root) ditempatkan pada posisi 1 dalam array
b. Left subtree data yang ada pada posisi ke-i diletakkan pada posisi 2i
BA
Gambar 2.12 Representasi Array untuk Pohon Biner pada Gambar 2.11
menambah selama eksekusi program. Kemudian jika bentuk pohon tidak seimbang
(misalkan miring kiri atau kanan) maka jumlah tempat yang terisi sangat sedikit
dibandingkan dengan jumlah tempat yang sudah disediakan. Hal ini tentunya merupakan
pemborosan. Di sisi lain representasi array memiliki keuntungan dalam waktu akses,
karena array merupakan satu blok memori yang contiguous.
b.
linked list (pointer) menjadi lebih sesuai dengan kondisi riel. Pohon biner dengan
representasi pointer hampir sama dengan double linked list sebelumnya dengan
menggunakan dua buah pointer untuk setiap simpul yakni pointer kiri dan pointer kanan.
Deklarasi pohon biner dengan defenisi ini dapat dituliskan dengan
Type
Pointer = ^Simpul;
Simpul = Record
Kiri: Pointer;
Data: TipeData; (*sesuai dengan kebutuhan; misalnya char, integer*)
Kanan : Pointer;
End;
PohonBiner = Pointer;
Dengan representasi linked list maka pohon pada Gambar 2.11 di atas dapat digambarkan
sebagai berikut:
T
A
B
D
C
E
F
I
Gambar 2.13. Representasi Linked List untuk Pohon Biner pada Gambar 2.11
Dari Gambar 2.13 di atas pohon biner dengan nama T yaitu sebuah pointer yang
menunjuk ke simpul yang berisi data A dengan pointer kiri menunjuk ke simpul yang
berisi data B (sebagai cabang kiri dari A) dan pointer kanan menunjuk ke simpul yang
berisi data C (sebagai cabang kanan dari A) dan seterusnya. Keuntungan representasi
linked list dibandingkan dengan representasi array adalah jumlah tempat yang dibutuhkan
bersifat fleksibel.
a.
- nya. Kemudian lakukan preorder terhadap left subtree dan right subtree. Sehingga kalau
terhadap pohon pada Gambar 2.11 sebelumnya dilakukan penelusuran preorder diperoleh
urutan sebagai berikut:
A, B, D, E, H, I, C, F, G
Rumus untuk preorder traversal adalah : Atas, Kiri (kalau ada), Kanan (kalau ada).
H
K
A
J
C
B
Dari binary tree gambar 2.14 pabila dilakukan preorder traversal akan
menghasilkan data H, A, C, B, D, K, J, L dimana proses traversal ini bisa dilihat pada
gambar 2.15.
Cetak Node H
Preorder
Cetak Node A
Right subtree
Cetak Node C
Left subtree
B
C
C
Right subtree
D
Left subtree
(kosong)
Cetak Node K
Right subtree
Left subtree
Cetak Node E
Left subtree
(kosong)
J
K
J
Right subtree
(kosong)
Cetak Node F
Right subtree
L
Left subtree
(kosong)
Right subtree
(kosong)
Cetak Node B
Left subtree
(kosong)
Right subtree
(kosong)
Cetak Node D
Left subtree
(kosong)
Right subtree
(kosong)
Gambar 2.15 Proses Preorder traversal dari binary tree gambar 2.14
b.
dan right subtree. Untuk menyelesaikan (menelusuri) left subtree dan right subtree
dilakukan dengan cara Inorder juga. Sehingga kalau terhadap pohon pada Gambar 2.11
sebelumnya dilakukan penelusuran inorder diperoleh urutan sebagai berikut:
D, B, H, E, I, A, F, C, G
Rumus untuk inorder traversal adalah: Kiri (kalau ada), Atas, Kanan (kalau ada).
Jika dilakukan inorder traversal terhadap binary tree gambar 2.14, akan
menghasilkan data H, A, C, B, D, K, J, L dimana proses traversal ini bisa dilihat pada
gambar 2.17.
Left subtree
(kosong)
Left subtree
Cetak Node A
Right subtree
A
C
B
Inorder
Left subtree
C
D
Cetak Node H
Left subtree
K
J
Cetak Node C
Cetak Node B
Right subtree
(kosong)
Left subtree
(kosong)
Right subtree
Cetak Node D
Right subtree
(kosong)
Left subtree
(kosong)
Cetak Node J
Right subtree
(kosong)
Right subtree
Left subtree
(kosong)
Cetak Node K
Right subtree
L
Left subtree
(kosong)
Cetak Node L
Right subtree
(kosong)
Gambar 2.17 Proses Inorder Traversal dari binary Tree gambar 2.16
c.
dan right subtree. Untuk menelusuri left subtree dan right subtree lakukan dengan cara
postorder pula. Sehingga kalau terhadap pohon pada Gambar 2.11 di atas dilakukan
penelusuran postorder diperoleh urutan sebagai berikut:
D, H, I, E, B, F, G, C, A
Rumus untuk Postorder Traversal adalah : Kiri (kalau ada), Kanan (kalau ada), Atas.
Jika dilakukan postorder traversal terhadap binary tree gambar 2.14, akan
menghasilkan data B, D, C, A, J, L, K, H dimana proses traversal ini bisa dilihat pada
gambar 2.18.
Left subtree
(kosong)
Right subtree
Left subtree
Right subtree
A
B
C
B
Postorder
Left subtree
Cetak Node C
Cetak Node A
Right subtree
Left subtree
K
J
Right subtree
Cetak Node H
Left subtree
(kosong)
Right subtree
(kosong)
Cetak Node B
Left subtree
(kosong)
Right subtree
(kosong)
Cetak Node D
Left subtree
(kosong)
Right subtree
(kosong)
Cetak Node J
Left subtree
(kosong)
Cetak Node L
Right subtree
(kosong)
Cetak Node K
Gambar 2.18 Proses Postorder Traversal dari binary tree gambar 2.16
d.
demi level dari kiri ke kanan. Sehingga kalau terhadap pohon pada Gambar 2.11 di atas
dilakukan penelusuran by level diperoleh urutan sebagai berikut:
A, B, C, D, E, F, G, H, I
Jika dilakukan levelorder traversal terhadap binary tree gambar 2.14, akan
menghasilkan data H, A, K, C, J, L, B, D.
2.2.2
T1
T2
Gambar 2.19 Bentuk Pohon Biner dengan Akar X dan sub Pohon T1 dan T2
Binary tree di atas disebut pohon pencarian biner (BST) jika syarat-syarat berikut
dipenuhi:
1.
2.
3.
Binary tree dengan 1 elemen dan pohon kosong adalah bentuk khusus BST
Pohon dengan sifat di atas disebut dengan pohon pencarian biner (BST) naik. BST
turun dengan mudah didefinisikan dengan mengubah sifat-sifat di atas sebagai berikut:
1.
2.
3.
Binary tree dengan 1 elemen dan pohon kosong adalah bentuk khusus BST
BST pada prinsipnya tidak membiarkan adanya duplikasi elemen, sehingga BST
adalah struktur yang merupakan set (himpunan).
Untuk jelasnya, dapat dilihat pada dua buah binary tree berikut ini yang
memenuhi kriteria pembuatan di atas.
9
18
10
21
15
10
9
23
13
15
18
13
21
23
a.
b.
Gambar 2.20 Contoh binary tree (a) Skewed left (b) Skewed right
Dari kedua binary tree pada gambar 2.20 bisa dilihat bahwa proses pencarian data
secara umum akan lebih cepat dilaksanakan pada tree pertama (gambar 2.20.a)
dibandingkan dengan tree kedua (gambar 2.20.b). Sebagai contoh untuk mencari bilangan
18, pada tree pertama cukup dilaksanakan satu kali perbandingan, sedangkan pada tree
kedua, perlu dilakukan lima kali perbandingan, sama halnya untuk mencari bilangan 23
dimana tree pertama memerlukan tiga kali perbandingan, sedangkan tree kedua
memerlukan tujuh kali perbandingan. Dari kedua contoh tersebut dapat dilihat bahwa
pencarian pada tree pertama lebih cepat dilaksnakan dibanding pencarian pada tree
kedua. Perbedaan akan semakin nyata apabila banyaknya data yang diketahui semakin
banyak.
Data
Ka
Type
Pointer = ^Simpul;
Node = Record
Ki : Pointer; (* pointer ke left subtree *)
Data : TipeData; (* TipeData tentukan sendiri *)
Ka : Pointer (* pointer ke right subtree *)
End;
BST = Pointer;
Deklarasi di atas dapat digunakan baik untuk BST naik maupun BST turun, yang
membedakannya hanya pada saat pemasukan data ke dalam BST. Dari deklarasi di atas,
apabila kita meng-copy BST ke variabel lain misalkan T, kemudian misalkan pohon T
berisi data 2,5,7,11 dan 13 dengan akar 7, dan misalkan T adalah BST naik maka salah
satu bentuk pohon T dapat digambarkan berikut ini:
11
13
Pohon T di atas disebut pohon dengan tinggi = 3. Kita dapat memiliki bentuk
pohon yang lain dengan akar = 7 dan tinggi = 3. Salah satunya seperti Gambar 2.23
berikut:
11
13
Gambar 2.23 Bentuk BST T yang lain berisi 2, 5, 7, 11, 13 dengan Akar 7
Mengosongkan BST
2.
3.
4.
5.
6.
Domain
Himpunan elemen dengan tipe data pilihan pemakai (Mis: char, Integer, Record
dll)
Operasi
1.
2.
Operasi Cek Kosong BST T = Empty(T) : Suatu fungsi yang menghasilkan nilai True jika
T kosong atau nilai False jika T tidak kosong
Tujuan
3.
Operasi Memasukkan data baru = Insert(x, T): suatu prosedur yang memasukkan x ke
dalam BST
Tujuan
4.
Operasi Cari = Member (x,T) : Suatu fungsi yang mencari apakah x ada di dalam BST T
atau tidak. Fungsi ini menghasilkan nilai Boolean
Tujuan
5.
Operasi Hapus = Delete (x,T) : Suatu prosedur yang menghapus elemen x dari dalam
BST T jika ditemukan dan Pesan kesalahan jika x tidak ditemukan
Tujuan
: BST mungkin berubah mungkin juga tetap. Jika x ditemukan dalam T maka
setelah operasi diperoleh T tanpa x, tetapi jika x tidak ditemukan maka T
tetap
6.
Operasi Tampil = Tampil(T) : Suatu prosedur untuk mendaftarkan elemen yang dimiliki
BST T. Metode pendaftaran dapat dilakukan dengan cara Preorder, Inorder atau
Postorder.
Tujuan
berikut dan Program BST yang disediakan adalah untuk BST naik. Untuk BST turun
diberikan sebagai latihan.
1. Procedure Makenul (T: BST);
Begin
T := Nil;
End;
T^.Data := x;
T^.Ka := Nil;
End
Else If x = T^.Data Then (* x sudah ada dalam T *)
Writeln(Error : data tersebut sudah ada *)
Else If x < T^.Data Then
Insert(x, T^.Ki) (*jika x < data yg ditunjuk T, maka sisipkan x ke kiri*)
Else (* x > data yang ditunuk T sisipkan x ke kanan *)
Insert(x, T^.Ka)
End;
Begin
Bantu := T;
T := T^.Ka; (* Set T = pointer kanannya *)
Bantu^.Ka := Nil (*putuskan hubungan node dengan kanannya *)
Dispose (Bantu) (*lepaskan node berisi x *)
End
Else If (T^.Ka = Nil) Then (*x berada pada node dimana kanannya nil *)
Begin
Bantu := T;
T := T^.Ki ; (* Set T = pointer kirinya *)
Bantu^.Ki := Nil; (*putuskan hubungan node dengan kirinya *)
Dispose (Bantu) (* lepaskan node yang berisi x *)
End
Else (* pointer kiri dan kanan T tidak kosong *)
T^.Data := DeleteMin(T^.Ka)
End;
Khusus untuk kasus yang terakhir dimana pointer kiri dan pointer kanan dari T
tidak kosong atau tidak nil, maka yang dilakukan adalah mencari pengganti. Untuk
pengganti dapat diambil maksimum dari kiri atau minimum dari kanan. Dalam operasi
delete di atas yang dipilih adalah minimum dari sub pohon kanan. Untuk data pengganti
yang diambil maksimum dari sub pohon kiri ditinggalkan sebagai latihan bagi pembaca.
Definisi dari DeleteMin dapat dilihat berikut ini:
Function DeleteMin (Var A : BST) : TipeData;
Var Bantu : Pointer;
Begin
If T^.Ki = Nil Then (*ditemukan data terkecil *)
Begin
Bantu := T ;(*tangkap node yang berisi data terkecil *)
6. Procedure Tampil(T);
Var Pilih : Integer;
Begin
Clrscr;
Writeln(1. Tampil Secara Preorder);
Writeln(2. Tampil Secara Inorder);
Writeln(3. Tampil Secara Postorder);
Writeln;
Write(Silahkan Pilih : ); Readln(Pilih);
If (Pilih = 1) Then
Preorder(T)
Else If (Pilih = 2) Then
Inorder (T)
Else
Postorder(T);
Readln
End;
2.2.3
AVL Tree
AVL Tree merupakan salah satu bentuk dari balanced BST dan nama AVL diambil
dari nama penemunya masing masing, yaitu Adelson, Velskii, dan Landis pada tahun
1962.
AVL Tree adalah suatu BST dimana setiap node yang mempunyai left subtree dan
right subtree, mempunyai sifat bahwa perbedaan height (tinggi) antara left subtree dan
right subtree maksimal adalah 1 (satu).
Untuk menunjukkan bahwa binary tree termasuk AVL Tree atau tidak dilakukan
dengan melihat masing masing node pada binary tree tersebut dan lakukan pengecekan
apakah node tersebut seimbang atau tidak.
dilakukan dengan
mengurangkan height dari left subtree dengan height dari right subtree dan nilai
keseimbangan dari setiap node yang didapat disesuaikan dengan kriteria sebagai berikut :
Fk (balanced factor) = height left subtree - height right subtree
Suatu BST merupakan AVL, apabila fk (balanced factor) setiap node pada BST
bernilai 0, -1, atau 1.
[http://www.cs.ust.hk/~lauhl/comp171/lab8.html]
Tree yang sudah AVL apabila ditambah sebuah node baru, misalnya 3 pada right
subtree dari 2, akan membuat tree tersebut tetap AVL.
5
2
1
2.
Tree tersebut sudah AVL, apabila ditambah sebuah node baru yang mengkibatkan
tree menjadi miring ke kiri atau ke kanan (tidak seimbang), misalnya 3
ditambahkan pada left subtree dari 1, subtree 2 menjadi miring ke kiri.
5
2
1
-1
bagian yang akan diseimbangkan kembali dalam sebuah AVL Tree, jadi dalam proses
8
penyeimbangan kembali sebuah tree tidak perlu dirubah seluruh struktur tree tersebut,
tetapi hanya struktur tree yang dimulai dari node pivot point saja.
Pivot Point
6
0
2
0
1
0
4
0
5 0
6
0
1
8
0
9
0
5
0
4
0
-1
2
0
0
1
0
2
8
0
5
0
5
0
-1
9
0
0
Gambar 2.26 Pivot
Point
Pada gambar 2.26 di atas, awalnya tree tidak mengandung pivot point, tetapi
setelah ditambah dengan node baru, yaitu node 5 akan muncul pivot point pada node 40
dan bukan pada node 60 karena node 40 merupakan node yang paling dekat dengan node
baru tersebut. Jadi
proses penyeimbangan yang akan dilakukan hanya berpengaruh pada
r
x
2
0
subtree mulai dari node 40.
x
2.2.3.2 hSingle Rotation -1
h+1
T
Proses1single rotation dapat dibagi dua menjadi LL Rotation dan RR Rotation dan
proses skemanya dapat dilihat pada gambar 2.27 dan gambar 2.28 di bawah
T ini.
h
T2
h+1
T3
T1
T2
+
1
+
2
r
h
h+1
T1
T2
T3
h+1
T1
T2
T3
r +2
r +2
w +1
x -1
h
T1
T2
h
T3
T4
w 0
T4
x
h
w 0
T1
T3
T1
T2
T2
T3
T4
Pada LR Rotation proses rotasi dilakukan sebanyak dua kali yaitu pertama
dilakukan RR Rotation terhadap left subtree dari node r dan dilanjutkan dengan LL
Rotation. Hasil perputaran ini akan mengakibatkan node w menjadi node root.
Proses RL rotation sama seperti LR Rotation dimana perbedaan hanya pada posisi
perputaran, seperti terlihat pada gambar 2.30.
r -2
w -2
w 0
x +1
T1
T2
w -1
r
T1
w 0
T4
T3
T2
h
h
x 0
T3
T1
T2
T3
T4
T4
Seperti halnya pada memasukkan node baru, setelah suatu node dihapus, maka
kondisi setiap node dalam tree perlu dicek untuk meyakinkan keadaan seimbangnya. Jika
dijumpai pada node yang left subtree dan right subtree nya tidak seimbang, maka pada
node tersebut perlu dilakukan penyeimbangan kembali dengan salah satu bentuk
penyeimbangan.
2.2.4
IPR Tree
IPR Tree adalah sebutan singkat untuk Internal Path Reduction Trees, yang
dikenalkan oleh Gonnet, yang merupakan salah satu bentuk BST dimana subtree dari
sebuah node-nya mempunyai height yang hampir sama dengan cara mengubah panjang
internal path - nya.
Penggunaan dengan IPR Tree tidaklah terlalu buruk dibanding dengan AVL Tree,
bahkan lebih baik untuk beberapa kasus.
Penampakan strukturnya selalu lebih baik
menggunakan parameter yang lebih mudah untuk memastikan nilai faktor keseimbangan
dengan memeriksa apakah sebuah binary tree sudah seimbang.
Parameter yang digunakan untuk menentukan keseimbangan disebut panjang
internal path dari suatu tree, yang ditegaskan menjadi jumlah depth dari semua node
pada tree.
B
Binary Tree di atas mempunyai panjang internal path 15 (dengan root adalah
satu). Panjang internal path dari suatu tree sama nilainya dengan penjumlahan
pemeriksaan kembali nilai node perlevel sebanyak satu kali pada tree tersebut. Dengan
mengurangi panjang internal path dari tree, kita juga mengurangi nilai node perlevel,
sehingga cukup memerlukan waktu.
Cara menghitung panjang internal path yang sederhana yaitu dengan mengurangi
count (nilai) node dalam sebuah subtree. Perhitungan akan lebih cepat dengan
menggunakan komputer dibanding secara manual. Jika kita mengubah tree seperti
gambar 2.32.a, berarti kita mengurangi panjang internal path dari tree dengan cara nc
na, dimana nc adalah jumlah node dalam subtree c (dilambangkan dengan sebuah gambar
segitiga) dan na adalah jumlah node dalam subtree a.
(a)
X
MR
X
Y
Single left rotation
nc > na
(b)
X
Double rotation
nX
> na
b
MR
Y
MR
B
Y
c
b1
(c)
b1
b2
b2
ML
Y
a
b2
b1
Single
rotation
nc > na
X
c
(d)
Double rotation
nb > na
ML
X
Y
ML
B
b2
b1
b2
b1
b1
b2
Panjang internal path dari tree sebelum perpindahan pada kondisi single rotation
(gambar 2.32.a dan gambar 2.32.c) adalah :
Ia + na + Ib + 2nb + Ic + 2nc + 3
Ia, Ib, dan Ic masing masing adalah panjang internal path dari subtree a, b, dan c.
Nilai Na dimasukkan sejak extra level (tingkat yang lebih tinggi) dijelajahi ketika
mengakses sejumlah node dalam subtree a melalui node x. Nilai Nb dikalikan dengan 2,
jika 2 level dari root pada subtree b ke node x. Tambahkan nilai 3 untuk internal path
dari node x dan y. Dalam penggunaan ekspresi ke contoh binary tree, kita memperoleh
hasil 15 untuk panjang internal path. Setelah pergeseran, panjang internal path nya
menjadi :
Ia + 2na + Ib + 2nb + Ic + nc + 3
b1
b2
untuk gambar 2.32.b, maka nb sama dengan nb1 + nb2 + 1. Untuk keterangan lebih jelas
dalam gambar 2.32.b dimana subtree b lebih dekat dengan struktur tengah daripada
Jika keduanya, single dan double transformation (perpindahan tunggal dan ganda)
dimungkinkan pada satu node dalam tree, single transformation digunakan lebih
sederhana. Kriteria keseimbangan diperiksa pada setiap node dalam binary tree pada
parent dari node yang dimasukkan ke root node pada binary tree yang lengkap. Berbeda
dengan AVL Tree, IPR Tree menuntut lebih dari satu transformation (perpindahan/
pergeseran).
Jika satu transformation terjadi, kita masih memeriksa ketidaksetimbangan tree
pada parent dari root yang terdahulu / sebelumnya. Lanjutkan pemeriksaan hingga kita
tiba pada root node pada tree yang lengkap. Diperlukan pemeriksaan keseimbangan IPR
dari left descendant baru pada root dari perpindahan subtree setelah single left rotation,
right descendant baru setelah right rotation dan keduanya descendant baru dari double
rotation . Algoritma IPR Insertion dapat dilihat pada algoritma berikut.
Catatan :
IPR-Insertion (x)
1
Setiap node pada path dari parent pada record yang baru dimasukkan ke
dalam root dari tree
a
If nc > na then
1
Seperti AVL Tree, insertion digunakan dalam sifat yang sama dengan BST hingga
muncul keseimbangan. Untuk lebih jelas, terlihat pada contoh berikut.
Jika Jefferson dan Hampton tanpa menuntut perpindahan, dan tidak dilakukan
pemeriksaan ketidakseimbangan, maka diperoleh paling sedikit tiga level dalam tree jika
Greenville ditambahkan, dan IPR Tree menjadi :
Jefferson
Hampton
Greenville
Hasil binary tree adalah kasus ML Tree dengan Jefferson sebagai node X dan
Hampton sebagai node Y pada gambar 2.32.c sebelumnya. Sehingga jika nc > na, dimana
selisih keduanya adalah nol, maka tree berada dalam ketidakseimbangan, sehingga tree
akan digeser ke kanan sekali untuk menyeimbangkannya menjadi :
Hampton
Greenville
Jefferson
Hampton
Greenville
Jefferson
Ahoskie
Tree ini dibandingkan dengan contoh dari ML Tree, tetapi jika tidak nc maupun nb
> na, maka tidak diperlukan pergeseran. Kemudian Gurnsey ditambahkan., hasil binary
tree menjadi :
Hampton
Greenville
Ahoskie
Jefferson
Gurnsey
Hampton
Greenville
Ahoskie
Jefferson
Gurnsey
Boone
Pemeriksaan keseimbangan dimulai pada tree dengan Ahoskie sebagai root, tetapi
Karena masih terdiri dari dua node, termasuk Boone yang baru dimasukkan jelas masih
tidak seimbang. Diperlukan test untuk ketidakseimbangan pada subtree tersebut dengan
Greenville sebagai root. Subtree ini menjadi ML, dan tidak memerlukan pergeseran.
Tetapi dalam penambahan, diperlukan pemeriksaan ketidakseimbangan pada root tree
(Hampton). Di sini, tree juga dalam keadaan ML, tetapi karena nc > na, maka digunakan
single rotation ke kanan untuk memperbaiki susunannya :
Greenville
Ahoskie
Boone
Hampton
Gurnsey
Jefferson
Ahoskie
Boone
Hampton
Gurnsey
Jefferson
Gusey
Hamilton
Gambar 2.41 Binary Tree dengan Input Node Gusey dan Hamilton
Greenville
Ahoskie
Hampton
Boone
Gurnsey
Gusey
Jefferson
Hamilton
Gambar 2.42 Binary Tree dengan Input Node Gusey dan Hamilton Setelah
Single Rotation ke Kiri
Pohon pada gambar 2.42 adalah AVL dengan internal path (IP) 22. Jika subtree
dengan Gurnsey sebagai root telah seimbang, maka tidak diperlukan penambahan
pergeseran. Subtree dengan Hampton sebagai root masih dalam keadaan ML yang
seimbang. Tetapi jika dilihat dari tree secara keseluruhan, masih dalam keadaan MR,
maka tree tidaklah seimbang dengan nb > na. Maka dipergunakan double rotation, pertama
right pivot, kemudian left pivot, maka hasil dari tree adalah:
Gusey
Greenville
Ahoskie
Gurnsey
Hampton
Hamilton
Jefferson
Boone
Gambar 2.43 Balanced Binary Tree dengan Input Node Gusey dan Hamilton
Pohon pada gambar 2.43 adalah AVL dengan IP 21, dan merupakan pohon IPR.
Pemeriksaan dilakukan pada kedua descendant dari Gusey untuk menentukan apakah
termasuk IPR Tree yang seimbang. Dari contoh di atas, rata rata yang diperoleh dengan
IPR Tree lebih baik dibanding menggunakan AVL Tree karena panjang internal path yang
diperoleh lebih kecil. Yaitu dengan adanya penggunaan pergeseran sebuah subtree dengan
kondisi ML atau MR pada tree, untuk menggeser subtree penuh ke subtree yang agak
kosong. Sehingga panjang internal path dapat dikurangi.
2.2.5
2 3 Tree
Berbeda dengan BST yang selalu bermasalah pada keseimbangan, 2 3 Tree ini
2.
3.
4.
Jika isi leaf node dibaca dari kiri ke kanan diperoleh urutan menaik.
5.
Tree kosong dan tree dengan satu data adalah bentuk khusus dari 2 3
Tree.
2.2.5.1
2 3 Tree Searching
1.
2.
3.
If else X > key of first record & X < key of second record, cari ke
cabang dua.
4.
5.
11
13
11
13
Bila diketahui 2 3 Tree seperti di atas, dan dilakukan pencarian terhadap data
yang tersimpan dan data yang tidak tersimpan dalam 2 3 Tree tersebut, maka
analisisnya dapat dilihat pada contoh 1 dan 2 berikut.
Contoh 1 :
Jika search for X = 7, maka langkah pencarian sebagai berikut :
X > 5 & X < 11 => cari ke cabang 2
X = 7 => data ditemukan
Contoh 2 :
Jika search for X = 9, maka langkah pencarian sebagai berikut :
X > 5 & X < 11 => cari ke cabang 2
X = 9 => data tidak ditemukan
7
11
13
11
13
Bila diketahui 2 3 Tree seperti di atas, dan dilakukan pencarian pada data yang
tersimpan dan data yang tidak tersimpan dalam 2 3 Tree tersebut, maka
analisisnya dapat dilihat pada contoh 3 dan 4.
Contoh 3 :
Jika search for X = 2, maka langkah pencarian sebagai berikut :
X < 7 => cari ke cabang 1
X = 2 => data ditemukan
Contoh 4 :
Jika search for X = 4, maka langkah pencarian sebagai berikut :
X < 7 => cari ke cabang 1
X > 3 & X < 5 => cari ke cabang 2
X = 4 => data tidak ditemukan
2.2.5.2 2 3 Tree Insertion (Penyisipan data dalam 2 3 Tree)
Algoritma insert X pada 2 3 Tree :
2 - 3 Tree Insertion
1.
2.
3.
Contoh :
Jika insert for X = 10, maka langkah penyisipan sebagai berikut :
X > 5 & X < 11
X > 7
=> leaf ketiga kosong, maka sisipkan data pada anak ketiga, atau
X < 13 => leaf ketiga kosong, maka geser leaf kedua ke leaf ketiga, dan leaf
pertama ke leaf kedua, sisipkan data pada leaf pertama dengan disertai perubahan
key pada external nodenya.
11
13
1
0
1
0
1
1
1
3
2.2.6
B Tree
B Tree merupakan salah satu struktur data terpenting dalam ilmu komputer,
dimana ini dapat meningkatkan penggunannya, namun BTree juga masih memiliki
banyak kelemahan.
Untuk itu, B Tree kemudian dikembangkan menjadi tree lainnya, yaitu B#
Tree dan B+ Tree. Istilah ini diperkenalkan oleh Knuth, namun arti untuk istilah B
Tree masih beraneka ragam.
pointer dalam nonleaf node (node yang bukan daun) adalah lebih banyak satu buah dari
density (jumlah record yang disimpan di dalam sebuah node), serta semua leaf node
berada pada level yang sama.
Dari defenisinya, maka B Tree dari kapasitas order satu mempunyai node
dengan satu dan dua key atau tiga pointer, seperti yang terlihat pada gambar di bawah
ini :
Pointer
Key (record)
Pointer
Key (record)
Pointer
Walaupun key field hanya diilustrasikan dalam bagian record dari sebuah node,
akan tetapi perlu diingat bahwa semua record tersimpan di sana. Ketika node penuh,
maka terjadi pembelahan menjadi node. Dan middle (tengah) record sebagai record set,
disusun dengan pengeluaran satu node tersebut dan dinaikkan menjadi level selanjutnya
yang lebih tinggi (sebagai root dari subtree tersebut). Middle record tersebut dipilih
menjadi pondasi pada key order.
Dengan defenisi dari kapasitas order dari suatu node, akan lebih mudah untuk
menentukan middle record, jika terjadi overflow (jumlah data input melebihi kapasitas
record yang tersedia atau melebihi jumlah record maksimum) pada saat penambahan satu
atau lebih record ke dalam satu node. Kesulitan akan timbul pada saat penentuan middle
record, pada saat jumlah record genap.
B Tree Insertion
1.
Aturlah B Tree sebagai index untuk peletakkan leaf node yang tepat untuk insert
record baru.
If < , maka ke cabang kiri ;
If = , maka record ditolak ;
If > ,
If menemui record di sebelah kanan , maka ulangi perbandingan seperti
sebelumnya untuk < dan = terhadap record tersebut.
Else, maka ke cabang kanan.
2.
b.
c.
d.
e.
Set posisi pointer dalam parent node dimana middle record dinaikkan. Set
pointer pada kiri record yang dinaikkan ke node dengan lexicographic
setengah lebih rendah dari record yang dibagi tersebut. Set pointer
pada kanan record
Misalkan, data insert sebagai berikut : cat, ant, dog, cow, rat, pig, dan gnu.
1.
cat
Jika kita tambahkan ant, tidak diperlukan pembelahan karena masih memiliki
cukup ruang.
ant
cat
Kemudian kita tambahkan dog. Karena kodisi overflow. Cat sebagai middle
record, diangkat ke level berikutnya yang lebih tinggi. Satu node di leaf level
dibagi menjadi dua node dan bentuk sebuah root node dengan cat. Pembelahan
ant
dog
4.
perbandingannya less than (lebih kecil dari), maka left subtree (cabang kiri), jika
sama, maka didapat duplicate record atau penemuan terhadap suatu record
diperlukan suatu perulangan. Jika lebih besar, bandingkan dengan key dari record
selanjutnya dari node. Ulangi proses perbandingan. Ikuti pointer ke kiri dari
record jika perbandingan less than sukses dilakukan. Jika perbandingan terhadap
last (rightmost) key pada node adalah lebih besar , maka hubungkan rightmost
subtree
dimasukkan ke dalam node yang berisi dog. Key untuk next record adalah rat.
Sehingga yang menjadi leaf node adalah cow dan dog. Karena node telah penuh,
maka diperlukan pembelahan dengan dog sebagai middle recordnya yang
dipromosikan ke root level. Leaf node awal dibelah menjadi dua node. Jika masih
ada ruang di root node untuk dog, maka tidak diperlukan pembelahan lagi.
Sehingga B-Tree tampak seperti berikut :
cat
ant
cow
dog
rat
Perincian penting : Semua record yang dimasukkan ke dalam leaf node, hanya
yang dinaikkan dari level yang lebih rendah adalah record yang dimasukkan ke
dalam nonleaf node.
5.
Selanjutnya pig ditambahkan. Karena secara lexicographic pig lebih besar dari
cat, maka bandingkan lagi dengan dog. Akan tetapi masih lebih besar, namun dog
merupakan last record pada node, maka jelajahi right subtree yang
menghubungkan dengan node yang berisi rat. Karena masih ada ruang, maka
proses insertion selesai. B Tree menjadi :
cat
ant
cow
dog
pig
rat
Record terakhir yang akan dimasukkan adalah gnu sebagai key. Record ini
6.
memperlihatkan pig dan rat sebagai leaf node. Karena node telah penuh, maka
diperlukan pembelahan. Pig dinaikkan ke root level, dan satu leaf node ini dibelah
menjadi dua node. Jika root node juga penuh, maka tidak ada ruang untuk
menaikkam record. Root node juga harus dibelah menjadi dua, dibentuk sebuah
root node dan level baru.
dog
cat
ant
pig
cow
gnu
rat
Pemeriksaan ulang untuk B Tree didefenisikan untuk menjadi sebuah pengaksesan dari
sebuah node dan bukan sebuah record.
Karena B Tree merupakan struktur data yang cukup penting, maka berikut akan
dijabarkan beberapa contoh dengan menggunakan data numerik untuk menguatkan
pemahaman mengenai mekanisme dasar dari B Tree.
1.
Insert 80
80
2.
Insert 50
50 80
3.
Insert 100
50 80 100
4.
Insert 90
50 80 90 100
5.
Insert 60
80
50 60
90 100
6.
Insert 65
80
50 60 65
90
100
90 100
7.
Insert 70
80
50 60 65 70
8.
Insert 75
65
50 60
80
70 75
90 100
9.
Insert 55 dan 64
65
50 60 60 64
80
70 75
90 100
10.
Insert 51
55
50 51
60 64
0
65
80
70 75
90 100
11.
Insert 76 dan 77
55
50 51
60 64
0
65
80
70 75 76 77 90 100
12.
Insert 78
55
50 51
60 64
0
65
76
70 75
80
77 78
90
100
90
100
13.
55
50 51
60 64
0
65
76
70 75
80
77 78
14.
Insert 150
55
55
50 51
60 64
65
65
76
80
80
70 75
77 78
90
150
100
200 300
200
300
Penggunaan perulangan pada kasus terburuk untuk B Tree adalah lebih sedikit
dibanding pada AVL atau IPR Tree karena B Tree mempunyai faktor percabangan yang
lebih tinggi.
Pemrosesan data berurut pada B Tree secara bertahap melalui node dari tree
dalam sebuah inorder traversal. Jika mempunyai lebih dari dua jalur percabangan,
dimana order adalah kiri, mempunyai node, pointer, , atau mengikuti alur sepanjang
garis keliling dari B Tree, maka akan tampak seperti berikut :
Dimulai dengan deepest node ke kiri, dalam kasus ini, A, node node diproses
pada sebuah path ke arah dalam struktur diprioritaskan daripada sebuah path ke arah luar,
atau di dalam diagram ini, ke arah path atas lebih diprioritaskan daripada path di bawah.
Bagan garis keliling sepanjang struktur akhir di atas merupakan alur yang
ditempuh oleh proses insert record ke dalam node pada B Tree berdasarkan
lexicographic pada dua contoh sebelumnya.
Penggunaan storage dari Tree adalah :
Jumlah record yang disimpan
Penggunaan storage untuk memasukkan seluruh data alphabetik di atas adalah 7/14
atau 50 persen, sedangkan untuk data numerik bahkan belum mencapai 50 persen.
Penggunaan storage paling rendah adalah setelah pembelahan, terutama dalam kasus
pembelahan yang melalui root. Pada saat penambahan record, penggunaan tempat
bertambah hingga pembelahan selanjutnya. Satu keuntungan dari B# Tree pada seksi
berikutnya mempunyai penggunaan tempat yang lebih besar.
73
84
87 91 92
Inorder successor of 84
Tanda mewakili pointer bercabang ke node
Jika tidak memenuhi ketentuan kapasitas minimum, sebuah record harus didelete
dari leaf node atau dipindahkan dari sebuah leaf node untuk ditempatkan ke tempat
lainnya, ketentuan kapasitas dilaksanakan dengan menyebarkan record ke dalam leaf
node dan salah satu dari sibling node digabung dengan sibling node lainnya. Contoh
penyebarannya :
200 350
85
53
90 100 105
200 350
90
53 85
100 105
200 350
85
53
90 100
Node A dalam keadaan deficient, namun node B, tidak mempunyai extra record.
Record di dalam dua leaf node dan perbandingan record di dalam parent node
dikombinasikan ke dalam satu node, sehingga strukturnya menjadi :
200
350
53 85 90 100
Gambar 2.73 Leaf Node A Mencapai Ketentuan Kapasitas Minimum
Perhatikan bahwa parent node sekarang berisi satu record lebih sedikit sejak
offspring (keturunan) - nya berkurang. Jika pemindahan record dari parent node
menyebabkan ketentuan kapasitas tidak terpenuhi, maka dilakukan penyebaran atau
penggabungan dengan sibling nodenya. Penggabungan akan menyalurkannya ke root
node. Jika root node berisi hanya sebuah record sebelum penggabungan, sehingga setelah
proses penggabungan, record tersebut tidak diperlukan dan level dari tree akan berkurang
satu.
Untuk pemahaman lebih lanjut, perhatikan contoh berikut :
51
11
12 15 22
30
66
33 41
53 54 63
68
78
69
71
76
79
84
93
1.
51
11
12 15 22
30
66
33 41
53 54 63
69
78
71
76
79
84
93
2.
Delete dari nonleaf node dan menukar posisi record tersebut sebuah record dari
sebuah leaf node yang memenuhi ketentuan kapasitas minimum.
Jika 51 didelete dari B Tree tersebut, karena merupakan nonleaf node, maka
ditempati oleh inorder successor record dari 51. Pindahkan 53 dari leaf node yang
masih memenuhi ketentuan kapasitas minimum, maka hasil dari tree menjadi :
53
11
30
66
12 15 22
33 41
54 63
69
78
71
76
79
84
93
3.
Delete dari sebuah leaf node yang menyebabkan ketentuan kapasitas minimum
tidak tercapai yang dapat dikoreksi dengan menyebarkan record tersebut ke
sibling node-nya.
Jika record dengan key 63 didelete, ketentuan kapasitas minimum tidak terpenuhi
pada node tersebut. Maka periksalah dengan penyebaran. Pada kumpulan tersebut,
mula mula lihatlah ke sibling node sebelah kanan, jika tidak mempunyai extra
record, maka lihatlah ke sibling node sebelah kiri. Pada contoh ini, sibling node
kanan tidak mempunyai extra record, maka penyebarannya menjadi :
53
11
12 15 22
30
69
33 41
54 66
71
78
76
79
84
93
4.
Delete dari sebuah leaf node yang menyebabkan ketentuan kapasitas minimum
tidak tercapai yang meminta penggabungan node.
Jika delete record dengan key 53 dari B Tree di atas, karena merupakan nonleaf
node, maka diperlukan penempatan dengan inorder succcessornya, 54. Tetapi
memindahkan 54 dari leaf nodenya menyebabkan storage tidak memenuhi
ketentuan kapasitas minimum. Penyebaran tidak memungkinkan karena sibling
node kanan tidak mempunyai extra record dan tidak mempunyai sibling node kiri.
Record di dalam leaf node dari dimana 54 dipindahkan bersama dengan record
dari sibling node kanan dan perbandingan record dalam parent node digabungkan
menjadi :
54
11
12
30
15
78
22
33 41
66
69
71
76
79
84
93
Gambar 2.78 B Tree N dengan delete 53 dengan Node C Tidak Memenuhi Ketentuan
12 15 22
0
30
54
33 41
78
66 69 71 76
79
84
93
Gambar 2.79 B Tree N dengan delete 53 dengan Node C yang Memenuhi Ketentuan
Seperti insert record pada B Tree, ukuran dan depthnya bertambah, sehingga
pada delete record dari B Tree ukuran dan depthnya akan berkurang. Semua terjadi
secara otomatis seperti pada prosedur insertion dan deletion. Ini biasanya diperlukan pada
penghapusan file untuk mengatur ulang struktur file.
B - Tree Searching
1.
3.
If
else X
>
selanjutnya.
a.
b.
ii.
iii.
Jika
11
12 15 22
0
30
54
33 41
78
66 69 71 76
Contoh 1 :
Pencarian untuk X = 11
1.
2.
79
84
93
Contoh 2 :
Pencarian untuk X = 66
1. Karena X tidak < 11, X tidak < 30, dan X juga tidak < 54, maka bandingkan
dengan record terakhir dari root node.
2. Karena X < 78, maka ambil cabang antara 54 dan 78. Kemudian bandingkan
dengan 66. X = 66, maka dat ditemukan.
Contoh 3 :
Pencarian untuk X = 50
1. Karena X tidak < 11 dan X juga tidak < 30, maka bandingkan dengan record 54.
2. Karena X < 54, maka ambil cabang antara 30 dan 54.
3. Karena tidak ada percabangan selanjutnya, ulangi perbandingan dari record
pertama pada node hingga record terakhir atau hingga data ditemukan atau
tidak ditemukan.
4. Karena X salah satu record pada node tersebut, maka data tidak ditemukan.