![]() |
| AVL Tree, karena factor tertingginya 1 |
![]() |
| Not AVL Tree, karena balance factor tertingginya 2, sedangkan syarat AVL adalah selisihnya maksimal 1 |
Cara menentukan Height dengan Balance Factor :
Height :
- Jika node (root) tidak memiliki subtree heightnya, maka = 0
- Jika node adalah leaf, height = 1
- Jika internal node, maka height = height tertinggi dari anak + 1
Balance Factor :
-selisih height antara anak kiri dengan kanan, jika tidak memiliki anak, maka dianggap 0.
AVL Tree Operations : Insertion
anggap O adalah node yang harus diseimbangkan kembali
- Kasus 1 : node terdalam terletak pada subtree kiri dari anak kiri O (kiri-kiri)
- Kasus 2 : node terdalam terletak pada subtree kiri dari anak kanan O (kiri-kanan)
- Kasus 3 : node terdalam terletak pada subtree kanan dari anak kiri O (kanan-kiri)
- Kasus 4 : node terdalam terletak pada subtree kanan dari anak kanan O (kanan-kanan)
- Kasus 1 dan 4 dengan single rotation
- Kasus 2 dan 3 dengan double rotation
Single Rotation
![]() |
| Single Rotation pada contoh diatas, left-left karena dari 30 ke 22 ke kiri, dan dari 22 ke 15 ke kiri juga |
Double Rotation
![]() |
| Step 1 (Rotasi pertama) kasus diatas adalah left-right |
AVL Tree Operations : Deletion
![]() |
| delete node 60 |
![]() |
| diseimbangkan dengan double rotation (left-right) karena dari 50 ke 25 kiri dan 25 ke 40 kanan |
![]() |
| AVL yang sudah balance |
A.
Pengertian 2-3 Tree
2-3
Tree adalah pohon/tree di data struct, dimana setiap node dengan anaknya
memiliki 2 node dan 1 data elemen atau 3 node dan 2 data elemen. 2-3 Tree
ditemukan oleh John Hopcroft pada tahun 1970.
Aturan
dalam 2-3 tree :
·
2-3 tree harus selalu hold, sehingga pohon
tetap seimbang (nilai wajib 1 setelah kanan dikurang kiri jadi nilainya 1).
Jadi, kita harus memastikan bahwa dua key node memiliki tiga anak, node satu
key memiliki dua anak, dan kita tidak bisa memiliki 3 key di satu node.
·
Semua insert dan removal dalam search tree
biasanya (dan pasti selama 2-3 Trees) terjadi pada leaf,itu jauh lebih mudah
untuk menangani dengan mengubah hal-hal di internal node.
·
Biasanya, pre-processing (untuk removal) ataupun
pasca-processing (untuk mengembalikan properti) diperlukan, selain untuk
menanbahkan dan menghapus key.
B.
Insertion
Setiap
kali kita memasukkan key (atau, lebih tepatnya, sepasang key) menjadi tree,hal
pertama yang kita lakukan adalah search, kemudian kita masukkan ke dalam simpul
leaf di mana pencarian dihentikan. Jika leaf node hanya memiliki satu key
sebelumnya, maka ia memiliki dua key.Tetapi jika simpul leaf sudah dua key,
maka sekarang memiliki tiga key, jadi kita harus memperbaikinya.
Misalkan
saya memiliki 10 angka (50 60 70 40 30 20 10 80 90 100) untuk kita input ke
tree yang kosong.
I.
Input 50
50
Inputan
pertaa dalam tree
II.
Input 60
50 60
Inputan
kedua, dimana angka 60 masuk ke node yang sudah ada, yaitu di dalam node angka
50
III.
Input 70
60
![]()
50 70
Karena
sudah tidak muat di node sebelum input angka 70, maka dibuatklah root baru di
tree tersebut dengan angka 60 di tengah, 50 tetap di kiri dan 70 di kanan.
IV.
Input 40
60
![]() |
|||
![]() |
|||
40
50 70
Angka
40 kita input di sebelah kiri node 50 karena 40<60, jadi posisinya di
sebelah kirinya.
V.
Input 30
40 60
![]() |
|||||
![]()
![]()
30 50 70
Angka
30 lebih kecil dari 60, maka kita masukkan ke sebelah kiri. Karena itu, maka
kita pindahkan angka 40 ke induk nya. Karena di induk memiliki dua data, maka
boleh memiliki 3 subtree, maka dibuatkan node/anak baru di sebelah kiri bawah
dengan angka 30.
VI.
Input 20

40 60
![]() |
|||
![]()
![]()
20 30
50 70
Angka
20<30, maka kita masukkan ke dalam angka 30 (nodenya)
VII.
Input 10
![]()
40

![]()

![]()
![]()
20
60
10 30 50 70
Karena 10<20, maka kita masukkan
di node angka 20 30. Namun karena sudah tidak muat, maka kita naikkan angka 20
ke atas. Nah, otomatis angka 40 juga naik dikarenakan node angka 40 60 juga
sudah tidak muat untuk menampung angka 20. Jadi angka 40 keangkat ke atas
dengan angka 60 turun ke sebelah kanan.
VIII. Input
80
![]()
40
![]() |
|||
20
60
![]() |
|||
![]()
10 30 50 70 80
Karena
80>70, maka kita masukkan angka 80 ke node angka 70 karena masih ada ruang
untuk diisi.
IX.
Input 90
![]()

40


20
60 80
![]() |
![]()
![]()
![]()
10 30 50 70 90
Dikarenakan
angka 90 sudah tidak muat di node angka 70 80, maka kita naikkan angka 80 ke
node angka 60. Dikarenakan node angka 60 80, maka sub nya bisa membentuk 3 sub
nodenya, jadi angka 70 terpisah menjadi satuan dan angka 90 membentuk node nya
sendiri.
X.
Input 100
![]()
40
![]() |
20
60 80
![]() |
|||
![]()
![]()
![]()
10 30 50 70
90 100
Seperti
biasa, karena 100>90, maka kita input angka 100 ke node angka 90.
Jadi, begitulah proses
insertion dalam 2-3 Tree
C.
Deletion
Proses
deletion ini kebalikan dari proses insertion, dimana leaf yang memiliki 3 node,
kita akan menhapusnya untuk jadi 2 node saja. Sebelum itu kita lakukan search
juga seperti tahapan insertion.
Aturan
Deletion :
·
Misalnya node yang dihapus adalah key
·
Delete sama seperti BST, yaitu digantikan oleh leafnya
·
Jika leaf 3-node, maka ambil salah satu
data untuk menggantikan key, seperti BST, terbesar dari subtree kiri atau
terkecil dari subtree kanan
·
Jika leaf 2-node, maka :
jika parent dari leaf adalah 3-node, maka
ambil satu data dari parent. kemudian kita perhatikan kembali siblingnya.
a) jika sibling 3-node, maka ambil satu
data kemudian push pada parent, agar parent kembali menjadi 3-node
b) jika sibling 2-node, maka biarkan
parent menjadi 2-node, dan satukan node tersebut dengan siblingnya
·
Jika parent dari leaf adalah 2-node, kita
perhatikan siblingnya.
a) jika sibling 3-node, ambil satu data
dari parent dan push satu nilai dari sibling ke parent.
b) jika sibling 2-node, maka satukan
sibling dengan parent.
Contohnya,
kita ambil data dari insertion untuk di deletion kan;

I.
Hapus angka 90
40
![]() |
|||
20
60 80
![]() |
|||
![]() |
![]()
![]()
10 30 50 70
100
Angka 90 tinggal dihapus
saja
II.
Hapus angka 100, lalu turun angka 80 untuk
ke node angka 100
40
![]() |
![]()
![]()
20 60
![]() |
|||||||||
![]() |
|||||||||
10 30 50 70
80 100
III.
Hapus angka 60, lalu ganti dengan naikkan
angka 80 ke node angka sebelumnya yang dihapus
40
20 80
10 30 50 70
100
IV.
Hapus angka 80, lalu ganti dengan naikkan
angka 70 ke node angka sebelumnya yang dihapus
40
10 30 50
100
V.
Hilangkan angka 40 dengan naikkan angka 30
ke untuk dimasukkan ke angka yang dihapus, angka 70 naik ke atas dengan
bergabung dengan angka 30. Lalu angka 10 dan 20 digabungkan menjadi 1 node (10
20). Angka 50 membentuk node sendiri, berikut juga angka 100 tetap disitu.
30 70
10 20 50 100
VI. Hilangkan angka 50, dengan begitu maka
angka 20 bisa membentuk node sendiri.
30
70
10 20 100
VII.
Tukar angka 20 ke angka 30 untuk
membetulkan arah/arus agar sesuai
20 70
10 30 100
VIII.
Hapus angka 20, lalu
gabungkan angka 10 dan 30 untuk sesuai aturan tree
70
10
30 100
Jadi, begitulah proses deletion di 2-3 Tree.























