Anda di halaman 1dari 79

BAB II

LANDASAN TEORI
2.1

Struktur Data Tree (pohon)


Tree (pohon) sebagai struktur data non linear yang banyak digunakan

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).

Gambar 2.1 G1 dan G2 adalah tree, sedangkan G3 dan G4 bukan tree

Contoh tree lainnya, misalkan himpunan V = {a, A, b, B, c, C, d, D} adalah empat


pasangan suami-istri, dimana a, b, c, dan d sebagai suami, dan A, B, C, D sebagai istri.
Misalkan a bercerita lewat telpon kepada A, yang kemudian A menelepon B, C, dan D,

selanjutnya B menelepon b, C menelepon c, dan D menelepon d. Prilaku tersebut dapat


dilihat pada Gambar 2.2 di bawah ini.

Gambar 2.2 Tree penyebaran gossip

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

Istilah Dasar pada Tree


Secara sederhana sebuah tree bisa didefenisikan sebagai kumpulan dari elemen

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.

Sebuah node tunggal adalah sebuah tree.

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.

Sebuah node tunggal, N

N
1

Subtree N1, N2, N3, , Nk

Tree baru yang terbentuk dari node N dan subtree


N1, N2, N3, , Nk

Gambar 2.3 Contoh pembentukan Tree

Level
A

Gambar 2.4 Contoh tree dengan 15 node

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

node C mempunyai degree 3. Node lain F, H, I, J, K, L, N, dan O yang semuanya


mempunyai degree 0 disebut juga dengan leaves (daun).
Leaf dan root tergolong external node (simpul luar), sedangkan selain node
tersebut di atas disebut dengan internal node (simpul dalam).
Height / depth (ketinggian / kedalaman) dari suatu tree adalah tingkat maksimum
dari suatu node dalam tree tersebut dikurangi dengan 1. Dengan demikian tree pada
gambar 2.4 yang mempunyai root pada node A mempunyai height 4.
Ancestor (leluhur) dari suatu node adalah semua node yang terletak dalam suatu
jalur dengan node tersebut mulai dari root sampai node yang ditinjau. Sebagai contoh
ancestor dari node L gambar 2.4 adalah node A, C, dan G.
Descendant (keturunan) dari suatu node adalah semua node yang terletak tepat di
bawah node tersebut. Sebagai contoh descendant dari node G pada gambar 2.4 adalah
node L, M, N, dan O.
Predecessor dari suatu node adalah semua node yang berada pada level di atas
dari level node tersebut. Sebagai contoh predecessor dari node G pada gambar 2.4 adalah
node A, B, dan C.
Successor dari suatu node adalah semua node yang berada pada level di bawah
dari level node tersebut. Sebagai contoh successor dari node G pada gambar 2.4 adalah
node I, J, K, L, M, N, dan O.
Sibling dari suatu node adalah semua node yang berada pada level yang sama
yang berasal dari node asal ( satu level di atas node yang ditinjau) yang sama dengan
node tersebut. Sebagai contoh sibling dari node G pada gambar 2.4 adalah node F dan H.

2.1.2

Cara cara Penggambaran Tree


Ada beberapa cara dalam menggambarkan bentuk tree. Pertama adalah paling

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

Gambar 2.5 Diagram Venn dari t ree pada gambar 2.4

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 ) ) )

Gambar 2.6 Notasi kurung dari t ree pada gambar 2.4

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

I dari tree pada gambar 2.4


Gambar 2.7 Notasi tingkat
E
Kelima hampir sama dengan cara keempatJdimana perbedaan hanya pada penggunaan

garis. Contoh tree dari gambar 2.4 dengan notasi tingkat sebagai berikut:

F
G
L
M
N
O
H

Gambar 2.8 Notasi garis dari tree pada gambar 2.4

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

Gambar 2.8 Contoh binary tree

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

Gambar 2.9 Complete binary tree level 4

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

Dengan memperhatikan gambar sembarang binary tree, kita akan memperoleh


tambahan informasi, yaitu banyaknya node maksimum pada level N adalah 2

(N-1)

Sehingga banyaknya node maksimum sampai level N adalah :


N

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.

Representasi Pohon Biner dengan Array


Pohon biner dapat direpresentasikan dengan array dengan ketentuan sebagai

berikut :
a. Akar (root) ditempatkan pada posisi 1 dalam array
b. Left subtree data yang ada pada posisi ke-i diletakkan pada posisi 2i

c. Right subtree - nya diletakkan pada posisi 2i + 1

Contoh: Misalkan pohon biner seperti gambar 2. 11 di bawah ini


A
C

BA

Gambar 2.11 Pohon Biner dengan Jumlah Level 4


Sesuai dengan aturan pada gambar 2.11 di atas, maka jumlah data maksimum jika
jumlah level = 4 adalah 15, sehingga kita menyediakan array dengan dimensi 15. Dengan
demikian pohon di atas akan disimpan dalam array seperti Gambar 2.12 di bawah ini :

Gambar 2.12 Representasi Array untuk Pohon Biner pada Gambar 2.11

Kelemahan dengan representasi array adalah sulitnya memperhitungkan jumlah


sel array yang harus disediakan untuk bentuk pohon biner yang belum diketahui, karena
permintaan tempat dilakukan sekaligus dan di awal program serta tidak dimungkinkan

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.

Representasi Pohon Biner dengan Linked List (pointer)


Dengan mempertimbangkan kelemahan representasi array, maka pilihan dengan

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.

2.2.1.2 Binary Tree Traversal (Penelusuran Pohon Biner)


Pohon biner dapat ditelusuri dengan 4 cara yakni:
a. Preorder Traversal (Penelusuran Preorder)
b. Inorder Traversal (Penelusuran Inorder)
c. Postorder Traversal (Penelusuran Postorder)
d. Order by Level (Penelusuran Level demi Level)

a.

Preorder Traversal (Penelusuran Preorder)


Pre artinya sebelum. Jadi pendaftaran parent dilakukan sebelum subtree

- 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

Gambar 2.14 Contoh binary tree

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.

Inorder Traversal (Penelusuran Inorder)


In artinya di antara. Jadi pendaftaran parent - nya dilakukan di antara left subtree

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.

Postorder Traversal (Penelusuran Postorder)


Post artinya setelah. Jadi pendaftaran parent - nya dilakukan setelah left subtree

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.

Order by Level / Levelorder (Penelusuran Level demi Level)


Penelusuran dengan cara ini dilakukan mulai dari root kemudian pendaftaran level

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

Binary Search Tree (BST)


Binary Search Tree (BST) adalah pohon biner yang berisi elemen sejenis dan unik

dengan sifat khusus sebagai berikut:


Misalkan diketahui sebuah pohon biner dengan akar X serta sub pohon kiri T1 dan
sub pohon kanan T2 seperti Gambar 2.19 di bawah ini:

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.

Y T1 < X < Z T2 dimana T1 dan T2 juga BST

2.

Apabila dilakukan Inorder Traversal akan diperoleh urutan naik

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.

Y T1 > X > Z T2 dimana T1 dan T2 juga BST

2.

Apabila dilakukan Inorder Traversal akan diperoleh urutan turun

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.

2.2.2.1 Representasi BST


Pohon biner pada prinsipnya bisa saja direpresentasikan sebagai array dengan
ketentuan akar akan menempati posisi 1 dan left subtree - nya menempati posisi 2
sedangkan right subtree - nya menempati posisi 3 dan seterusnya. Dengan demikian jika
node X menempati posisi I maka left subtree X menempati posisi 2I sementara right
subtree - nya menempati posisi 2 I + 1. Dengan demikian jika pohon biner memiliki
tinggi = h, maka jumlah lokasi yang dibutuhkan harus disediakan sebanyak 2 h 1. Akan
tetapi dengan representasi array jumlah elemen terbatas, serta apabila pohon miring ke
kanan dengan tinggi h maka jumlah sel yang terisi hanya sebanyak h dari 2 h 1 yang
disediakan. Ini adalah pemborosan. Untuk mengatasi hal ini maka pohon biner umumnya
dan BST khususnya dapat direpresentasikan dengan menggunakan pointer. Setiap node
(simpul) dinyatakan sebagai record yang terdiri dari 3 field yaitu: Pointer ke left subtree,
data dan pointer ke right subtree seperti terlihat pada Gambar 2.21 berikut ini:
Ki

Data

Ka

Gambar 2.21 Representasi Node dengan Dua Pointer Ki dan Ka


Secara lengkap deklarasi BST dapat dituliskan sebagai berikut:

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

Gambar 2.22 BST T dengan Elemen 2, 5, 7, 11, 13 dan Akar 7

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

2.2.2.2 Operasi-Operasi dalam BST


Sama seperti struktur data lainnya, maka terhadap BST kita dapat mendefinisi-kan
sejumlah operasi dasar seperti:
1.

Mengosongkan BST

2.

Mencek apakah BST kosong

3.

Memasukkan data baru ke dalam BST

4.

Mencari elemen tertentu dalam BST

5.

Menghapus data tertentu dari dalam BST

6.

Menampilkan semua elemen dalam BST

Jadi BST dapat dijelaskan dengan spesifikasi berikut:


Spesifikasi :

Tipe Data Terstruktur BST

Domain

Himpunan elemen dengan tipe data pilihan pemakai (Mis: char, Integer, Record
dll)

Operasi

1.

Misalkan kita definisikan 6 operasi seperti di atas yaitu :

Operasi Mengosongkan BST / Menciptakan BST Baru T = Makenul(T) : Suatu prosedur


yang menyebabkan T menjadi BST kosong
Tujuan

: Untuk Menciptakan BST pertama sekali atau mengosongkan BST T yang


sudah terisi. Walaupun yang terakhir ini tidak dianjurkan

Sebelum : BST T berisi atau sama sekali belum pernah ada


Sesudah : BST T yang tadinya berisi menjadi kosong atau Membuat BST T yang baru

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

: Untuk Mengetahui apakah BST T kosong atau tidak

Sebelum : tidak ada


Sesudah : BST T tidak berubah, tetapi hanya menghasilkan nilai Benar (True) atau Salah
(False)
Operasi ini perlu dilakukan sebelum melakukan operasi-operasi seperti: Menghapus,
Mencari, atau Menampilkan

3.

Operasi Memasukkan data baru = Insert(x, T): suatu prosedur yang memasukkan x ke
dalam BST
Tujuan

: Untuk menyisipkan x (elemen baru) ke dalam BST

Sebelum : tidak ada


Sesudah : BST T sebelumnya ditambah x sebagai elemen baru

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

: Mencari x di dalam BST T

Sebelum : BST sudah pernah ada


Sesudah : BST T tidak berubah, hanya menghasilkan True jika x ditemukan dan False
jika tidak

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

: Menghilangkan x dari dalam BST T

Sebelum : BST T tidak kosong


Setelah

: 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

: Menampilkan semua elemen dalam BST T

Sebelum : BST T tidak kosong


Sesudah : Tidak mengubah BST T

Berikut ini didefinisikan dan dijelaskan masing-masing operasi di atas dan


selengkapnya dapat dilihat pada program BST di akhir dari Bab ini. Operasi-operasi

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;

2. Function Empty(T : BST) : Boolean;


Begin
Empty := (T = Nil)
End;

Kedua operasi di atas cukup jelas

3. Procedure Insert(x : TipeData; Var T : BST);


Begin
If T = Nil Then (* Jika ditemukan T yang nil *)
Begin
New(T);(* ciptakan node baru ditunjuk oleh T *)
T^.Ki := Nil;

(* Set pointer kiri = nil *)

T^.Data := x;

(* Isi data pada node = x *)

T^.Ka := Nil;

(* Set pointer kanan = 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;

4. Function Member (x: TipeData, T : BST) : Boolean;


Begin
If T = Nil Then
Member := False
Else If x = T^.Data Then
Member := True (* x ditemukan *)
Else If x < T^.Data Then
Member := Member(x, T^.Ki) (*cari x ke kiri *)
Else (*x > T^.Data *)
Member := Member(x, T^.Ka) (* cari secara rekursif ke kanan *)
End;

5. Procedure Delete (x : TipeData; Var T : BST);


Var Bantu : Pointer;
Begin
If T = Nil Then
Writeln(Error : , x, tidak ditemukan )
Else If x < T^.Data Then
Delete(x, T^.Ki) (* rekursif ke kiri *)
Else If x > T^.Data Then
Delete(x, T^.Ka) (*rekursif ke kanan *)
Else (*x ditemukan *)
If (T^.Ki = Nil And T^.Ka = Nil) Then (*Kasus x adalah daun *)
Begin
Bantu := T; (*Tangkap node dengan pointer Bantu *)
T:=Nil;(*potong T yang tadinya menunjuk node berisi x *)
Dispose(Bantu) (*deallocate Bantu atau lepaskan node *)
End
Else If (T^.Ki = Nil) Then (*x berada pada node dimana kirinya nil *)

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 *)

DeleteMin := T^.Data; (*Ambil&simpan data terkecil *)


T := T^.Ka; (* Set T = pointer kanannya *)
Bantu^.Ka := Nil; (*lepaskan hubungan node tsb dgn anaknya *)
Dispose (Bantu) (*lepaskan node yang berisi data terkecil *)
End
Else
DeleteMin := DeleteMin(T^.Ki) (*rekursif ke kiri *)
End;

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.

Suatu node dikatakan seimbang atau tidak, dapat

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]

2.2.3.1 New Node Insertion (Menyisipkan Node Baru)


Dalam melakukan proses insert node baru pada AVL Tree perlu diperhatikan
bahwa urutan informasi pada tree tidak boleh berubah atau dengan kata lain inorder
traversal harus tetap dipertahankan.
Jika suatu node dimasukkan pada AVL Tree, maka nilai keseimbangan dari setiap
node pada tree akan berubah, oleh karena itu perlu dilakukan perhitungan ulang pada
setiap untuk mengecek keseimbangan. Apabila terdapat node yang tidak seimbang, maka
perlu dilakukan proses penyeimbangan. Terdapat dua kemungkinan perubahan nilai
tersebut, antara lain :
1.

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

Gambar 2.24 Kemungkinan perubahan insert node baru pertama

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

Gambar 2.25 Kemungkinan perubahan insert node baru kedua


Proses penyeimbangan pada sebuah tree dapat terjadi dalam dua kasus dan
masing masing bisa dibagi lagi dalam dua sub kasus yang serupa. Kasus pertama
disebut dengan single rotation (pemutaran tunggal) dan kasus kedua disebut dengan
double rotation (pemutaran ganda). Pemutaran tunggal dibagi menjadi LL Rotation
(pemutaran tunggal ke kiri) dan RR Rotation (pemutaran tunggal ke kanan). Pemutaran
ganda dibagi menjadi LR Rotation (pemutaran ganda kiri dan kanan), dan RL Rotation
(pemutaran ganda kanan dan kiri).

2.2.3.1 Pivot Point


Pivot point adalah node yang mempunyai nilai keseimbangan lebih besar dari 2
5
2

atau lebih kecil dari -2, yang letaknya


5 -1 paling dekat dengan node baru yang telah
dimasukkan, misalnya 5. Node pada pivot point beserta dengan subtree nya merupakan

-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

Gambar 2.27 Skema LL Rotation


Pada gambar 2.27, proses perputaran dilakukan kearah kiri dikarenakan right
subtree pada node r lebih berat dibandingkan left subtree. Proses perputaran akan
membuat node x menjadi root menggantikan node r dan node T2 akan berpindah menjadi
milik node r. Hasil akhir proses perputaran ini akan didapatkan suatu tree yang seimbang.

+
1

+
2

r
h

h+1

T1

T2

T3
h+1

T1

T2

T3

Gambar 2.28 Skema RR Rotation

Proses RR Rotation hampir sama dengan proses LL Rotation, dimana


perbedaannya hanyalah pada posisi dimana untuk RR Rotation node pada left subtree
lebih berat dibanding right subtree. Oleh karena itu, proses perputaran akan berputar ke
kanan untuk menyeimbangkannya.
2.2.3.3 Double Rotation
Kasus kedua dalam melakukan pemutaran adalah double rotation. Suatu binary
tree yang memerlukan double rotation dapat dilihat pada skema di bawah ini.

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

Gambar 2.29 Skema LR Rotation

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

Gambar 2.30 Skema RL Rotation

2.2.3.2 Menghapus node


Menghapus node lebih sulit dilakukan dibanding memasukkan node baru,
terutama dalam hal mengatur kembali posisi posisi node. Tetapi secara garis besar dapat
dikatakan bahwa jika suatu node dihapus, kecuali node yang bertindak sebagai leaf, maka
posisinya akan diganti oleh node lain yang merupakan urutan sebelumnya apabila dibaca
secara inorder (atau node paling maksimum dari subtree kiri).

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

daripada struktur AVL Tree, dan

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

Gambar 2.31 Binary Tree

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.

2.2.4.1 IPR Transformation


Seperti AVL Tree, IPR Tree mempunyai empat kemungkinan (lihat gambar 2.32.a,
b, c, dan d) untuk perpindahan. Pada gambar 2.32.a dan 2.32.b bisa digunakan ketika tree
dalam keadaan MR (more nodes to the right) dan dua gambar lainnya, yaitu gambar
2.32.c dan 2.32.d dimungkinkan terjadi jika tree dalam keadaan ML (more nodes to the
left).

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

Gambar 2.32 Internal Path Reduction Transformation

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

Perbedaan antara panjang internal path setelah perpindahan sebelum adalah :


nc na
Jadi panjang internal path akan berkurang jika nc na > 0, atau sama, jika
nc > na
Struktur binary tree diperlihatkan dahulu ke single rotation pada gambar 2.32.a adalah
binary tree yang sama seperti diperlihatkan sebelum double rotation pada gambar 2.32.b.
Pemberian struktur binary tree diperiksa untuk dua tipe perpindahan, kemudian menjadi
sebuah perbedaan dalam dua struktur dalam perluasan subtree b dalam gambar 2.32.a.

Gambar 2.33 Node b


ke dalam struktur

b1

b2

Gambar 2.34 Subtree dengan leaf b1 dan 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

subtree a. Hasilnya, subtree b1 dipindahkan ke satu arah dan subtree b2 dipindahkan


terpisah dengan arah yang lain selama perpindahan.
Ulangilah analisis untuk binary tree dalam 2.32.b, kita memperoleh panjang
internal path sebelum perpindahan menjadi :
Ia + na + Ib1 + 3nb1 + Ib2 + 3nb2 + Ic + 2nc + 6
Internal path untuk tree setelah perpindahan adalah :
Ia + 2na + Ib1 + 2nb1 + Ib2 + 2nb2 + Ic + 2nc + 5
Perbedaan antar internal path setelah dan sebelum perpindahan adalah :
nb1 + nb2 na + 1
Kriteria penggunaan double rotation :
nb1 + nb2 na + 1 > 0
Jika nb1 + nb2 + 1 diletakkan oleh nb, dengan criteria yang dapat dituliskan
sebagai :
nb > na

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 :

Perbedaan arti dalam menetapkan ketidaksetimbangan pada IPR Tree


dengan AVL Tree yaitu IPR Tree menggunakan count dari node pada
subtree sedangkan AVL Tree menggunakan height dari subtree.

2.2.4.2 IPR Insertion


Algoritma IPR Insertion ini dalam mengimplementasikan secara berulang atau
dengan penyimpanan pada record (kumpulan dari node dan pointer), lokasi dari node
yang memerlukan penambahan proses.

IPR-Insertion (x)
1

Insert record ke dalam IPR Tree dengan BST insertion procedure

Setiap node pada path dari parent pada record yang baru dimasukkan ke
dalam root dari tree
a

Menetapkan jika gabungan subtree mempunyai beberapa MR atau ML


(atau tidak ada).[untuk mengetahui apakah menggunakan left atau
right rotation]

If nc > na then
1

Gunakan single rotation pada arah yang tepat

Setelah sebuah left / right rotation, periksa subtree dari left /


right descendant yang baru dari root pada transformation
subtree untuk kesetimbangan. Jika tidak seimbang, pindah dan
ulangi test dan gunakan rotation tambahan.

Else if nb > na then


1

Gunakan double rotation dengan arah yang tepat

Periksa keduanya, descendant baru untuk kesetimbangan dan


ulangi penggunaan rotation yang diperlukan

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

Gambar 2.35 ML Tree dengan input node 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

Gambar 2.36 Balanced Tree (tree seimbang menurut gambar 2.32.c)

Right descendant dari Hampton seimbang, maka tidak diperlukan pergeseran


lebih jauh lagi. Ketika Ahoskie ditambahkan, binary tree nya menjadi :

Hampton

Greenville

Jefferson

Ahoskie

Gambar 2.37 Binary Tree dengan Input Node 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

Gambar 2.38 Binary Tree dengan Input Node Gurnsey


Jika masih ML Tree, untuk alasan yang sama dengan sebelumnya , pergeseran
tidak diperlukan. Ketika Boone ditambahkan, binary tree menjadi :

Hampton

Greenville

Ahoskie

Jefferson

Gurnsey

Boone

Gambar 2.39 Binary Tree dengan Input Node Gurnsey

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

Gambar 2.40 Balanced Tree dengan Greenville sebagai root

Setelah memeriksa right descendant dari Greenville untuk keseimbangan,


lanjutkan dengan penambahan Gusey dan Hamilton, hasil tree adalah :
Greenville

Ahoskie

Boone

Hampton

Gurnsey

Jefferson

Gusey

Hamilton

Gambar 2.41 Binary Tree dengan Input Node Gusey dan Hamilton

Mulailah pemeriksaan jalur untuk node yang barusan dimasukkan dengan


Hamilton sebagai key (kunci). Pertama, dengan memeriksa keseimbangan dari subtree
yang dimulai dari Gusey, kemudian Gurnsey sebagai root. Subtree lanjut ini dalam
kondisi MR. Jika nc > na, gunakan single rotation ke kiri untuk membuat subtree kembali
seimbang.

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

merupakan tree yang selalu berada dalam kondisi keseimbangan.


Adapun sifat sifat yang dimiliki oleh 2 3 Tree diantaranya :
1.

Faktor percabangan minimal 2 (dua) node, maksimal 3 (tiga) node.

2.

Data pada 2 3 Tree selalu disimpan pada leaf.

3.

Pada internal node 2 3 Tree hanya berisi record key.

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 (Pencarian dengan 2 3 Tree)


Algoritma pencarian X pada 2 3 Tree :

2 3 Tree Searching
1.

If X < key of first record, cari ke cabang pertama.

2.

If else X = key of first record, data ditemukan.

3.

If else X > key of first record & X < key of second record, cari ke
cabang dua.

4.

If else X > key of second record, cari ke cabang tiga.

5.

Else X = key of second record, data ditemukan.

11

13

11

Gambar 2.44 2 3 Tree dengan tiga percabangan

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

Gambar 2.45 2 3 Tree dengan dua percabangan

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.

If X key of first record, insert ke cabang pertama.


If jumlah external node = 3, maka lanjutkan ke cabang kedua.

2.

If else X key of first record & X key of second record, cari ke


cabang dua.
If jumlah external node = 3, maka lanjutkan ke cabang ketiga.

3.

If else X > key of second record, cari ke cabang tiga.


If jumlah external node = 3, maka bentuk level baru.

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

Gambar 2.46 Penyisipan node 10 pada 2 3 Tree

2.2.6

B Tree
B Tree merupakan salah satu struktur data terpenting dalam ilmu komputer,

karena ketidakterbatasannya dan penggunaanya yang berkarakteristik. BTree merupakan


suatu pilihan yang tepat untuk menyimpan data yang harus diakses bersamaan secara
berurut dan langsung.

Comer menguraikan B Tree sebagai ubiquitous (yang berarti bersifat di mana


mana; hadir di mana mana). Sifatnya yang ubiquitous mungkin merupakan akibat dari
penggunaanya. Menurut catatan Comer, istilah untuk B Tree tidak dapat dijelaskan
secara pasti. B bisa mengacu pada maksud balanced (seimbang) atau broad (luas),
ataupun bushy (belukar). Salah satu sumbernya adalah Bayer dan McCreight, yang
bekerja di Boeing. Menurutnya, B tidakmengacu pada binary.
Binary tree mempunyai faktor percabangan (cabang yang berasal dari satu node)
tidak lebih dari dua, sedangkan B Tree tidak mempunyai batas percabangan (batas
percabangannya dapat ditentukan sendiri). Faktor percabangan yang lebih tinggi
merupakan konsekuensi untuk penyimpanan record yang lebih banyak pada setiap node.
Karena perbedaan itulah, maka B Tree sering disebut multiway search tree.
Pada saat pembentukan, menurut struktur tree yang telah diketahui adalah tumbuh
/ berawal dari atas ke bawah (bersifat top down), dimana tree tumbuh dengan insertion
sebuah node baru di bawah tree. Node akan berada tetap pada posisinya, tetapi node akhir
/ leaf berubah jika ada penambahan.
Dengan B Tree, record baru dimasukkan ke dalam leaf level, tetapi di root level
atau atas dari tree berubah jika B Tree bertambah tinggi. Keuntungan dari bentuk
pertumbuhan bottom up (bawah ke atas) adalah senantiasa strukturnya selalu seimbang
tanpa perpindahan / perputaran seperti yang diperlukan AVL dan IPR Tree. Keseimbangan
ini meletakkan upper bound (batas atas) untuk penggunaan pada kasus terburuk, untuk
mengakses record tunggal. Faktor percabangan untuk B Tree selalu lebih banyak
daripada AVL atau IPR Tree, namun depth - nya selalu lebih kecil untuk jumlah record
yang sama. Depth yang lebih kecil ini maksudnya lebih sedikitnya pemeriksaan berulang,

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.

2.2.6.1 Defenisi B Tree


Pada dasarnya B-Tree merupakan tree seimbang yang mirip dengan 2-3 Tree.
Namun kelebihannya dibandingkan dengan 2-3 Tree adalah internal node pada B-Tree
dapat digunakan untuk menyimpan data sekaligus sebagai search key atau search index
(kunci pencarian).
Komposisi dari node B Tree mirip dengan sekeranjang atau seblok record yang
di dalamnya terdiri dari berbagai input. Record record yang disimpan di dalam sebuah
node tergantung pada kapasitas ordernya. Kapasitas order dan contrainst (desakan)
lainnya pada B Tree dispesifikasikan dalam defenisi umumnya.
Setiap node kecuali root, harus mempunyai pemakaian storage (tempat
penyimpanan) paling sedikit 50 %. Pointer dalam node point menurunkan node (pada
level selanjutnya yang lebih rendah) dari B Tree, jika leaf node tidak mempunyai
keturunan (generasi penerus),

dimana pointernya adalah null (diwakili ). Jumlah

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

Gambar 2.47 Ilustrasi key field dari node pada B - Tree

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.

2.2.6.2 B Tree Insertion


Prosedur insertion pada B Tree akan diuraikan secara terperinci melalui dua
contoh berikut. Pertama, B Tree akan diuraikan dengan menggunakan key order
alpahabetik. Kemudian contoh kedua dengan key order numerik. Dimana kapasitas order
akan menghasilkan pembelahan yang berulang yang akan membantu menjelaskan
mekanisme dari insertion ke dalam B Tree. Nilai yang dipilih untuk kapasitas order
tergantung pada parameter seperti : computer block atau page size dan record size untuk
file.
Untuk contoh pertama, dimulai dengan insert nama hewan berhuruf tiga, untuk
contoh yang lebih sederhana dan penulisan yang singkat. Insert yang akan dilakukan
didasarkan pada algoritma berikut :

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.

If ruang masih memungkinkan, insert record baru menurut posisi lexicographic


(menurut abjad / alphabetic) di dalam sebuah node,
Else while kondisi overflow maka :
a.

If overflowing node (node yang kelebihan record) sebagai root node,


bentuklah sebuah root node baru dalam posisi parent ke root node
sekarang,

b.
c.

Belahlah overflowing node ke dalam dua node.


Pilihlah middle record menurut lexicographic diantara semua record yang
insert dan akan menjadi overflowing node. Naikkan middle record ke
parent node nya dan letakkan berdasarkan posisi lexicographic yang
benar.

d.

Letakkan record secara lexicographic sebelum middle record ke dalam


salah satu node dan record sisa ke dalam node lainnya.

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

yang dinaikkan ke node dengan lexicographic

diatas dari record yang dibagi tersebut.

Misalkan, data insert sebagai berikut : cat, ant, dog, cow, rat, pig, dan gnu.
1.

Jika insert cat, maka :

cat

Gambar 2.48 Leaf Node B - Tree dengan insert cat


2.

Jika kita tambahkan ant, tidak diperlukan pembelahan karena masih memiliki
cukup ruang.

ant

cat

Gambar 2.49 Leaf Node B - Tree dengan insert ant


3.

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

menyebabkan height dari B Tree bertambah satu, tetapi perhatikan bahwa


pertumbuhan terjadi pada top dari tree. Sehingga B Tree menjadi :
cat

ant

dog

Gambar 2.50 B - Tree dengan insert dog

4.

Record dengan cow sebagai key ditambahkan selanjutnya. Untuk menemukan


node yang tepat untuk penempatan, aturlah B Tree dengan prosedur yang sama
seperti yang digunakan pada insert dalam BST. Key dari record yang diinsert
dibandingkan dengan key

dari leftmost record dalam root node. Jika

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

dengan node tersebut. Dengan mengikuti proses ini, untuk cow

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

Gambar 2.51 B - Tree dengan insert 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

Gambar 2.52 B - Tree dengan insert pig

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

Gambar 2.53 B - Tree dengan insert 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

Gambar 2.54 Leaf Node B - Tree dengan insert 80

2.

Insert 50
50 80

Gambar 2.55 Leaf Node B - Tree dengan insert 50

3.

Insert 100
50 80 100

Gambar 2.56 Leaf Node B - Tree dengan insert 100

4.

Insert 90
50 80 90 100

Gambar 2.57 Leaf Node B - Tree dengan insert 90

5.

Insert 60

80

50 60

90 100

Gambar 2.58 B - Tree dengan insert 60

6.

Insert 65

80

50 60 65

90

100

90 100

Gambar 2.59 B - Tree dengan insert 65

7.

Insert 70

80

50 60 65 70

Gambar 2.60 B - Tree dengan insert 70

8.

Insert 75

65

50 60

80

70 75

90 100

Gambar 2.61 B - Tree dengan insert 75

9.

Insert 55 dan 64

65

50 60 60 64

80

70 75

90 100

Gambar 2.62 B - Tree dengan insert 55 dan 64

10.

Insert 51

55

50 51

60 64
0

65

80

70 75

90 100

Gambar 2.63 B - Tree dengan insert 51

11.

Insert 76 dan 77

55

50 51

60 64
0

65

80

70 75 76 77 90 100

Gambar 2.64 B - Tree dengan insert 76 dan 77

12.

Insert 78

55

50 51

60 64
0

65

76

70 75

80

77 78

90

100

90

100

Gambar 2.65 B - Tree dengan insert 78

13.

Insert 200 dan 300

55

50 51

60 64
0

65

76

70 75

80

77 78

Gambar 2.66 B - Tree dengan insert 200 dan 300

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

Gambar 2.67 B - Tree dengan insert 150

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 :

Gambar 2.68 Bagan Alur Prioritas Proses Data pada B Tree

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

Jumlah slot dari storage yang disediakan

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.

2.2.6.3 B Tree Deletion (Penghapusan pada B Tree)


Deletion merupakan lawan dari insertion. Sebuah record dibuang dari sebuah
node, dengan mempertahankan jumlah penggunaan tempat minimal dan struktur indeks
untuk record perulangan. Jika record yang didelete (dihapus), bukan leaf node, maka
diperlukan perpindahan record dari leaf node ke posisi record yang didelete, untuk
mempertahankan sebuah key untuk membandingkan ketika pencarian pada indeks.
Untuk itu, indeks perlu dipertahankan. Record yang didelete dari sebuah leaf node
ditempatkan dengan inorder successor ynag ditempatkan dengan mengikuti pointer
setelah record didelete dan kemudian mengikuti leftmost pointer sepanjang node tidak
null hingga tiba pada node tersebut. Sebagai contoh pada gambar di bawah, diperlihatkan
bahwa 87 adalah inorder successor dari 84.

73

84

200 350 460

120 160 176

87 91 92

Inorder successor of 84
Tanda mewakili pointer bercabang ke node

Gambar 2.69 Inorder Successor dari 84 pada B Tree

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

Gambar 2.70 Leaf Node A Tidak Mencapai Ketentuan Kapasitas Minimum

Node A tidak mencapai ketentuan kapasitas minimum jika di dalam sebuah


nonroot node kurang dari setengah yang terisi. Tetapi sibling node di kanannya, node B,
terisi lebih dari batas minimum. Node A dapat meminjam dari node B untuk mencapai
kapasitas kapasitas minimum. Record di dalam dua node bergabung dengan perbandingan
record dalam parent node disebarkan seperti :

200 350

90

53 85

100 105

Gambar 2.71 Leaf Node yang Mencapai Ketentuan Kapasitas Minimum

Sekarang kedua node A dan B memenuhi ketentuan kapasitas minimum.


Perhatikan bahwa perbandingan record dalam parent node telah berubah, ini diperlukan
untuk mempertahankan B Tree tetap lexicographic. Jika penyebaran tidak
memungkinkan, dimana, sibling node tidak mempunyai extra record (node yang jumlah
recordnya melebihi kapasitas minimum), kemudian deficient node (node yang jumlah
recordnya tidak memenuhi kapasitas minimum) digabung dengan sibling node. Dengan
penggabungan, record di dalam dua node dikombinasikan ke dalam satu node, misalnya
pada kondisi B Tree berikut :

200 350

85

53

90 100

Gambar 2.72 Leaf Node A Tidak Mencapai Ketentuan Kapasitas Minimum

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

Gambar 2.74 Contoh B Tree N dengan 3 Level

1.

Delete dari leaf node yang mencapai ketentuan batas minimum.


Menghapus 68 dari contoh tree yang melukiskan kondisi ini. Tiga record
mempertahankann nodenya setelah deletion tersebut, maka storage masih
memenuhi ketentuan. Tree menjadi :

51

11

12 15 22

30

66

33 41

53 54 63

69

78

71

76

Gambar 2.75 B Tree N dengan Delete 68

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

Gambar 2.76 B Tree N dengan Delete 51

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

Gambar 2.77 B Tree N dengan delete 63

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

Perhatikan bahwa node C tidak memenuhi ketentuan kapasitas minimum.


Usahakan penyebaran atau penggabungan hingga kembali memenuhi ketentuan. Node C
tidak mempunyai sibling node kanan dan sibling node kiri-nya tidak mempunyai extra
record. Gabungkan node C dengan sibling node kiri-nya. Dalam pelaksanaan pemindahan
record tunggal dari root node yang sekarang, dimana yang dapat dipindahkan dan level
dari B Tree menjadi berkurang satu. Sehingga bentuk dari B Tree sekarang menjadi :
11

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.

2.2.6.4 B Tree Searching


Prosedur searching pada B Tree hampir sama dengan prosedur searching pada
tree yang lain.
Algoritma pencarian X pada B Tree :

B - Tree Searching
1.

If X < key of first record, cari ke leftmost node.

Ulangi hingga akhir percabangan, atau hingga data ditemukan atau


tidak ditemukan.
2.

If else X = key of first record, data ditemukan.

3.

If

else X

>

key of first record, bandingkan X dengan record

selanjutnya.
a.

Jika record selanjutnya adalah null, maka langsung cari pada


rightmost node. Cari pada node dengan langkah 1, 2, dan 3,
hingga akhir percabangan atau hingga data ditemukan atau
tidak ditemukan.

b.

Jika tidak maka bandingkan,


i.

Jika < , maka carilah node pada cabang diantara record


sebelumnya dan sekarang.

ii.

Jika = , maka data ditemukan.

iii.

Jika

> , maka ulangi langkah a dan b hingga akhir

percabangan atau hingga data ditemukan atau tidak


ditemukan.

11

12 15 22
0

30

54

33 41

78

66 69 71 76

Gambar 2.80 B Tree N dengan 2 Level

Contoh 1 :
Pencarian untuk X = 11
1.

If X < 11, karena bukan maka lanjut ke langkah 2.

2.

If X = 11, maka data ditemukan.

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.

Anda mungkin juga menyukai