LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA
BAB : ADT AVL TREE
NAMA : MOH. ARIF ANDRIAN
NIM : 156150600111002
TANGGAL : 03/12/2016
ASISTEN : HARITS ABDURROHMAN
DEFINISI MASALAH
Tambahkan method untuk menghapus suatu node pada pohon AVL
Dalam proses penyisipan data ke dalam pohon AVL jika kondisi pohon tidak seimbang maka harus dilakukan rotas kiri, rotasi kanan, rotasi kiri kana, atau rotasi kanan dan kiri. Dari program di atas pada baris berapakah dilakukan masing-masing proses ini.
Perbaikilah program di pada latihan 10.1 di atas menjadi sub-sub program dengan menambahkan sub program putarKiri, putarKanan, putarKiriKanan, putarKananKiri.
SOURCE CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
package Praktikum10;
public class Node{
int data;
int tinggi; //tinggi node
Node pKiri;
Node pKanan;
Node pInduk;// pointer ke induk
//constructor node
public Node(int dt, int tg, Node pKi, Node pKa, Node pI){
this.data = dt;
this.tinggi = tg;
this.pKiri = pKi;
this.pKanan = pKa;
this.pInduk = pI;
}
}
class AVLT {
private Node root;
public AVLT()
{root = null;}
//cari dt di tree, mengembalikan true jika ditemukan
//dan false jika tidak
public boolean cariDt(int dt){
Node temp = root;
while(temp != null){
if(dt == temp.data)
return true;
//cariDt subtree pKiri
else if(dt < temp.data)
temp = temp.pKiri;
//cariDt subtree pKanan
else
temp = temp.pKanan;
}
//dt tidak ditemukan
return false;
}
//sisip dt ke dalam tree, returns true if berhasil,
// false jika gagal
//tree diseimbangkan menggunakan algoritma AVL
public boolean sisipDt(int dt){
if(root == null){
//sisip dt di root
root = new Node(dt, 1, null, null, null);
return true;
}
//tree tidak kosong
else {
//mulai dari root
Node temp = root;
Node prev = null;
//cari lokasi penyisipan dt
while(temp != null){
if(dt == temp.data)
return false;
//sisip dt di subtree pKiri
else if(dt < temp.data){
prev = temp;
temp = temp.pKiri;
}
//sisip dt di subtree pKanan
else {
prev = temp;
temp = temp.pKanan;
}
}
//buat node baru
temp = new Node(dt, 1, null, null, prev);
if(dt < prev.data)
prev.pKiri = temp;//sisip di pKiri
else
prev.pKanan = temp; //sisipDt at pKanan
//mulai dari node yang disisipkan dan
//bergerak menuju root
while(temp != null){
//subtree pKiri dan pKanan memenuhi kondisi AVL
if(Math.abs(tinggi(temp.pKiri)-
tinggi(temp.pKanan)) <=1){
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
}
//kasus 1 algoritma AVL
else if(tinggi(temp.pKiri)- tinggi(temp.pKanan)>= 2 &&
tinggi(temp.pKiri.pKiri) >= tinggi(temp.pKiri.pKanan)){
Node parent = temp.pInduk;
Node pKiri = temp.pKiri;
temp.pKiri = pKiri.pKanan;
if(temp.pKiri != null)
temp.pKiri.pInduk = temp;
pKiri.pKanan = temp;
temp.pInduk = pKiri;
pKiri.pInduk = parent;
if(parent == null)
root = pKiri;
else if(parent.pKiri==temp)
parent.pKiri = pKiri;
else
parent.pKanan = pKiri;
//hitung tinggi subtree pKanan
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
temp = pKiri;
//hitung tinggi dari root
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
}
//case 2 algoritma AVl
else if(tinggi(temp.pKanan)- tinggi(temp.pKiri)>= 2 &&
tinggi(temp.pKanan.pKanan) >= tinggi(temp.pKanan.pKiri)){
Node parent = temp.pInduk;
Node pKanan = temp.pKanan;
temp.pKanan = pKanan.pKiri;
if(temp.pKanan != null)
temp.pKanan.pInduk = temp;
pKanan.pKiri = temp;
temp.pInduk = pKanan;
pKanan.pInduk = parent;
if(parent == null)
root = pKanan;
else if(parent.pKanan == temp)
parent.pKanan = pKanan;
else
parent.pKiri = pKanan;
//hitung tinggi subtree pKanan
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
temp = pKanan;
//hitung tinggi dari root
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
}
//kasus 3 dari algoritma AVL
else if(tinggi(temp.pKiri)- tinggi(temp.pKanan)>= 2 &&
tinggi(temp.pKiri.pKanan) >= tinggi(temp.pKiri.pKiri)){
Node parent = temp.pInduk;
Node pKiripKanan = temp.pKiri.pKanan;
temp.pKiri.pKanan = pKiripKanan.pKiri;
if(temp.pKiri.pKanan!= null)
temp.pKiri.pKanan.pInduk = temp.pKiri;
pKiripKanan.pKiri = temp.pKiri;
temp.pKiri.pInduk = pKiripKanan;
temp.pKiri = pKiripKanan.pKanan;
if(temp.pKiri != null)
temp.pKiri.pInduk = temp;
pKiripKanan.pKanan = temp;
temp.pInduk = pKiripKanan;
pKiripKanan.pInduk = parent;
if(parent == null)
root = pKiripKanan;
else if(parent.pKiri==temp)
parent.pKiri = pKiripKanan;
else
parent.pKanan = pKiripKanan;
//hitung tinggi subtree pKanan
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
temp = pKiripKanan;
//hitung tinggi dari root
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
}
//kasus 4 dari algoritma AVL
else if(tinggi(temp.pKanan)- tinggi(temp.pKiri)>= 2 &&
tinggi(temp.pKanan.pKiri) >= tinggi(temp.pKanan.pKanan)){
Node parent = temp.pInduk;
Node pKananpKiri = temp.pKanan.pKiri;
temp.pKanan.pKiri = pKananpKiri.pKanan;
if(temp.pKanan.pKiri!= null)
temp.pKanan.pKiri.pInduk = temp.pKanan;
pKananpKiri.pKanan = temp.pKanan;
temp.pKanan.pInduk = pKananpKiri;
temp.pKanan = pKananpKiri.pKiri;
if(temp.pKanan != null)
temp.pKanan.pInduk = temp;
pKananpKiri.pKiri = temp;
temp.pInduk = pKananpKiri;
pKananpKiri.pInduk = parent;
if(parent == null)
root = pKananpKiri;
else if(parent.pKanan == temp)
parent.pKanan = pKananpKiri;
else
parent.pKiri = pKananpKiri;
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
temp = pKananpKiri;
temp.tinggi = Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)) +1;
}
temp = temp.pInduk;
}
//penyisipan berhasil
return true;
}
}
public int tinggi(){
return root.tinggi;}
private int tinggi(Node node){
if(node == null)
return 0;
else
return node.tinggi;
}
//hitung node-node dari tree
public int jumlahNode() {
return jumlahNode(root);
}
public void inOrderTraversal(){
inOrder(root);
}
private void inOrder(Node r){
if (r == null)
return;
inOrder(r.pKiri);
System.out.printf("-%d",r.data);
inOrder(r.pKanan);
}
//hitung node-node dari tree
private int jumlahNode(Node node){
if(node == null)
return 0;
else
return 1 +jumlahNode(node.pKiri)+jumlahNode(node.pKanan);
}
//menghapus suatu node
public void remove(int k){
// mencari node
removeAVL(this.root, k);
System.out.println("Hapus : " + k);
}
//proses pencarian penghapusan
public void removeAVL(Node p,int q){
if (p==null){
return;
}else {
if (p.data > q){
removeAVL (p.pKiri, q);
}else if (p.data < q){
removeAVL (p.pKanan, q);
}else if (p.data == q){
//datayang ditemukan langsung masuk ke method removeFoundNode
removeFoundNode(p);
}
}
}
//node yang dihapus ditemukan
public void removeFoundNode(Node q){
Node r;
//at least one child of q, q will be removed directly
if (q.pKiri == null "" q.pKanan == null){
//root terhapus
if (q.pInduk == null){
this.root = null;
q = null;
return;
}
r = q;
}else {
// jika memiliki anak akan diganti dengan pewaris (successor)
r = successor(q);
q.data = r.data;
}
System.out.println(" ");
Node p;
if (r.pKiri!=null){
p=r.pKiri;
}else{
p =r.pKanan;
}
if(p != null){
p.pInduk =r.pInduk;
}
if(r.pInduk == null){
this.root = p;
}else{
if(r==r.pInduk.pKiri){
r.pInduk.pKiri = p;
}else{
r.pInduk.pKiri = p;
}
//penyeimbangan berhenti sampai root
}
r = null;
}
// method pewaris
public Node successor(Node q){
if(q.pKanan != null){
Node r = q.pKanan;
while (r.pKiri !=null){
r = r.pKiri;
}
return r;
}else {
Node p = q.pInduk;
while (p != null && q == p.pKanan){
q=p;
p=q.pInduk;
}
return p;
}
}
public static void main (String[] args) {
AVLT t = new AVLT();
System.out.println("==================== AVL TREE =====================");
t.sisipDt(3); t.inOrderTraversal();System.out.println();
t.sisipDt(4); t.inOrderTraversal();System.out.println();
t.sisipDt(6); t.inOrderTraversal();System.out.println();
t.sisipDt(5); t.inOrderTraversal();System.out.println();
t.sisipDt(15); t.inOrderTraversal();System.out.println();
t.sisipDt(10); t.inOrderTraversal();System.out.println();
t.sisipDt(20); t.inOrderTraversal();System.out.println();
t.sisipDt(17); t.inOrderTraversal();System.out.println();
t.sisipDt(25);t.inOrderTraversal();System.out.println();
System.out.println("\n============== HAPUS NODE AVL TREE ================");
t.remove(3); t.inOrderTraversal();System.out.println();
t.remove(6); t.inOrderTraversal();System.out.println();
t.remove(17); t.inOrderTraversal();System.out.println();
System.out.println("===================================================");
System.out.println(" THANKS");
System.out.println("===================================================");
}
}
PEMBAHASAN
1
2
3
4
5
6
7
9
10
11
12
13
14
17
18
19
20
21
22
23
24
25
26
27
29
30
31
32
33
36
41
42
44
45
48
50
51
53
54
55
57
58
59
62
63
64
68
69
70
71
72
75
77
79
83
86
87
88
89
90
91
92
93
94
95
96
97
98
99
101
103
105
109
112
113
115
116
117
119
120
122
123
124
125
126
127
128
130
132
134
138
141
142
144
145
146
148
149
150
151
152
153
154
156
157
158
159
160
161
162
164
166
168
172
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
196
197
200
203
206
207
208
209
210
211
212
215
216
218
219
222
223
224
225
226
227
230
231
232
233
234
238
240
241
244
245
246
247
248
249
250
251
252
253
260
261
264
266
267
268
269
271
272
275
276
278
280
281
282
283
284
286
287
289
290
291
292
293
294
295
299
302
303
304
305
306
308
309
310
311
312
313
315
319
320
321
323
324
325
326
327
328
330
331
332
333
334
335
336
337
338
339
341
343
345
346
347
348
349
350
352
354
Deklarasi package dengan nama Praktikum10
Deklarasi class dengan nama Node.
Deklarasi variable dengan nama data bertipe integer.
Deklarasi variable dengan nama tinggi bertipe integer.
Deklarasi variable dengan nama pKiri bertipe Node.
Deklarasi variable dengan nama pKanan bertipe Node.
Deklarasi variable dengan nama pInduk bertipe Node.
Constructor dengan nama Node yang berparameter int dt, int tg, Node pKi, Node pKa,Node pI.
Memberi nilai data sama dengan dt.
Memberi nilai tinggi sama dengan tg.
Memberi nilai pKiri sama dengan pKi.
Memberi nilai pKanan sama dengan pKa.
Memberi nilai pInduk sama dengan pI.
Deklarasi class dengan nama AVLT
Deklarasi variable root dengan tipe data Node yang bermodifier private.
Constructor dengan nama AVLT.
Memberi nilai root sama dengan null.
Pemberian komentar
Pemberian komentar
Method dengan nama criDt yang bertipe Boolean dan berparameter int dt.
Memberi nilai tempt sama dengan root.
Perulangan while dengan syarat jika tempt tidak sama dengan null.
Pemilihan kondisi if dengan syarat jika dt sama dengan temp data.
Retun berfungsi mengembalikan nilai true.
Pemilihan kondisi dengan else if yang bersyarat jika dt kurang dari temp data.
Temp sama dengan temp pKiri.
Pemberian komentar
Pernyataan else.
Temp sama dengan temp pKanan.
Return berfungsi mengembalikan nilai false.
Method dengan nama sisipDt bertipe data boolean yang berparameter int dt
Pernyataan if bersyarat jika root sama dengan null.
Root sama dengan node.
Return berfungsi mengembalikan nilai true.
Pernyataan else.
Temp sama dengan root.
Prev sama dengan null.
Perulangan while jika temp tidak sama dengan null.
Pernyataan if jika dt sama dengan temp data.
Return berfungsi mengembalikan nilai false.
Pemilihan kondisi else if bersyarat jika dt kurang dari temp data.
Prev sama dengan temp.
Temp sama dengan temp pKiri.
Pernyataan else.
Prev sama dengan temp.
Temp sama dengan temp pKanan.
Temp sama dengan node.
Pemilihan kondisi if bersyarat jika dt kurang dari prev data.
pKiri sama dengan temp.
Pernyataan else.
pKanan sama dengan temp.
Perulangan while yang bersyarat jika temp tidak sama dengan null.
Pemilihan kondisi if yang bersyarat jika tinggi temp pKiri dikurangi tinggi temp pKanan kurang dari sama dengan 1.
Temp tinggi sama dengan math max ditambah 1.
Pemilihan kondisi else if jika tinggi temp pKiri dikurangi tinggi temp pKanan lebih dari sama dengan 2 dan tinggi temp pKiri pKiri lebih besar sama dengan tinggi temp pKiri pKanan.
Parent sama dengan temp pInduk.
pKiri sama dengan temp pKiri.
pKiri sama dengan pKiri pKanan.
Pemilihan kondisi if bersyarat jika temp pKiri tidak sama dengan null.
Temp pKiri pInduk sama dengan temp.
pKiri pKanan sama dengan temp.
pInduk sama dengan pKiri.
pInduk sama dengan parent.
Pemilihan kondisi dengan if yang bersyarat jika parent sama dengan null.
Root sama dengan pKiri.
Pernyataan else if jika pKiri parent sama dengan temp.
pKiri parent sama dengan pKiri.
Pemilihan kondisi else.
pKanan parent sama dengan pKiri.
Tinggi sama dengan math max ditambah 1.
Temp sama dengan pKiri.
Tinggi sama dengan math max ditambah 1.
Pemilihan kondisi else if yang bersyarat jika tinggi temp pKanan dikurangi tinggi temp pKiri lebih dari sama dengan 2 dan tinggi temp pKanan pKanan lebih besar sama dengan tinggi temp pKanan pKiri.
Parent sama dengan pInduk.
pKanan sama dengan pKanan.
pKanan pInduk sama dengan pKanan pKiri.
Pemilihan kondisi if yang bersyarat jika pKanan tidak sama dengan null.
pKanan pInduk sama dengan temp.
pKanan pKiri sama dengan temp.
pInduk temp sama dengan pKanan.
pKanan pInduk sama dengan parent.
Pemilihan kondisi if yang bersyarat jika parent sama dengan null.
Root sama dengan pKanan.
Pemilihan kondisi else if yang bersyarat jika pKanan parent sama dengan temp.
pKanan parent sama dengan pKanan.
Pernyataan else.
pKiri parent sama dengan pKanan.
Tinggi sama dengn math max ditambah 1.
Temp sama dengan pKanan.
Tinggi sama dengan math max ditambah 1.
Pernyataan else if jika tinggi temp pKiri dikurangi tinggi temp pKanan lebih dari sama dengan 2 dan tinggi temp pKiri pKanan lebih besar sama dengan tinggi temp pKiri pKiri.
Parent sama dengan pInduk.
pKiri pKanan sama dengan pKiri pKanan.
pKiri pKanan sama dengan pKiri pKanan pKiri.
Pernyataan if jika pKiri pKanan tidak sama dengan null.
pKiri pKanan pInduk sama dengan pKiri.
pKiri pKanan pKiri sama dengan pKiri temp.
pKiri pInduk sama dengan pKiri pKanan.
pKiri sama dengan pKiri pKanan pKanan.
Pemilihan kondisi if bersyarat jika pKiri tidak sama dengan null.
pKiri pInduk sama dengan temp.
pKiri pKanan pKanan sama dengan temp.
pInduk sama dengan pKiri pKanan.
pKiri pKanan pInduk sama dengan parent.
Pemilihan kondisi if yang bersyarat jika parent sama dengan null.
Root sama dengan pKiri pKanan.
Pemilihan kondisi else if yang bersyarat jika pKri parent sama dengan temp.
pKiri parent sama dengan pKiri pKanan.
Pernyataan else.
pKanan parent sama dengan pKiri pKanan.
Tinggi sama dengan math max ditambah 1.
Temp sama dengan pKiri pKanan.
Tinggi sama dengan math max ditambah 1.
Pemilihan kondisi dengan else if yang bersyarat jika tinggi temp pKanan dikurangi tinggi temp pKiri lebih dari sama dengan 2 dan tinggi temp pKanan pKiri lebih besar sama dengan tinggi temp pKanan pKanan.
Parent sama dengan temp pInduk
pKanan pKiri sama dengan pKanan pKiri temp.
pKanan pKIri sama dengan pKanan pKiei pKanan.
Pernyataan if yang bersyaratjika pKanan pKiri tidak sama dengan null.
pKanan pKiri pInduk sama dengan pKanan.
pKanan pKiri pKanan sama dengan pKanan.
pKanan pInduk sama dengan pKanan pKiri.
pKanan sama dengan pKanan pKiri pKiri.
Pemilihan kondisi if yang bersyarat jika pKanan tidak sama dengan null.
pKanan pInduk sama dengan temp.
pKanan pKiri pKiri sama dengan temp.
pInduk sama dengan pKanan pKiri.
pKanan pKiri pInduk sama dengan parent.
Pernyataan if jika parent sama dengan null.
Root sama dengan pKanan pKiri.
Pernyataan else if yang bersyarat jika pKanan sama dengan temp.
pKanan sama dengan pKanan pKiri.
Pernyataan else.
pKiri sama dengan pKanan pKiri.
Tinggi sama dengan math max ditambah 1.
Temp sama dengan pKanan pKiri.
Tinggi sama dengan math max ditambah 1.
Temp sama dengan pInduk.
Return berfungsi mengembalikan nilai true.
Method dengan nama tinggi yang bertipe data int dengan modifier public.
Return mengembalikan nilai root tinggi.
Method tinggi yang berparameter Node node yang bertipe data int dengan modifier private.
Pernyataan if yang bersyarat jika node sama dengan null.
Mengembalikan nilai 0.
Pernyataan else.
Mengembalikan nilai node tinggi.
Method jumlahNode yang bertipe data int dengan modifier public.
Mengembalikan nilai jumlahNode.
Method void bernama inOrderTraversal.
inOrder root.
Method void bernama inOrder yang berparameter Node r dengan modifier private.
Pernyataan if bersyarat jika r sama dengan null.
Mengembalikan nilai.
inOrder r pKiri.
Menampilkan -> r data.
inOrder r pKanan.
Method bernama jumlahNode yang berparameter Node node yang bertipe data int dengan modifier private.
Pernyataan if bersyarat jika node sama dengan null.
Return mengembalikan nilai 0.
Pernyataan else.
Mengembalikan nilai 1 ditambah method jumlahNode pKiri ditambah jumlahNode pKanan.
Method dengan nama remove yang bertipe void berparameter int k.
Mencari node yang akan di hapus.
Perintah untuk mencetak node yang akan dihapus.
Method dengan nama removeAVL dengan parameter Node p, int q bertipe void dan modifier public.
Pemilihan kondisi dengan if yang bersyarat p sama dengan null.
Return berfungsi mengembalikan nilai.
Pernyataan else
Pemilihan kondisi if yang bersyarat jika p data nilainya lebih dari q.
Menghapus node yang akan di hapus.
Pemilihan kondisi dengan else if yang bersyarat jika p data nilainya lebih kecil dari q.
Berfungsi untuk menghapus node yang akan dihapus.
Pemilihan kondisi dengan else if yang bersyarat p data sama dengan q.
Berfungsi untuk menemukan data di tree.
Method dengan nama removeFoundNode yang berparameter Node q , bertipe void dan bermodifier public.
Deklarasi variable r dengan tipe data Node.
Pemilihan kondisi if yang bersyarat pKiri q sama dengan null atau pKanan q sama dengan null.
Pemilihan kondisi if yang bersyarat jika q pInduk sama dengan null.
Root sama dengan null.
Nilai q sama dengan null.
Return berfungsi mengembalikan nilai.
Dekalrasi nilai r sama dengan q.
Pernyataan else.
Memberi nilai r sama dengan method successor.
Data q sama dengan data r nilainya.
Perintah untuk mencetak baris kosong.
Deklarasi variable p bertipe data Node.
Pemilihan kondisi dengan if yang bersyarat jika pKiri r tidak sama dengan null.
Memberi nilai p sama dengan pKiri r.
Pernyataan else.
Memberi nilai p sama dengan nilai pKanan r.
Pemilihan kondisi dengan if yang bersyart jika p tidak sama dengan null.
Memberi nilai pInduk p sama dengan pInduk r.
Pemilihan kondisi dengan if yang bersyarat jika pInduk r sama dengan null.
Memberi nilai root samadengan p.
Pernyataan else.
Pemilhan kondisi dengan if yang bersyarat jiak r sama dengan pInduk r pKiri.
Memberi nilai pInduk r sama dengan p.
Pernyataan else.
Memberi nilai pInduk pKiri r sama dengan p.
Deklarasi variable r denagn nilai null.
Deklarasi method bertipe Node dengan nama successor yang memiliki parameter bernama q dengan tipe data Node
Proses pemilihan kondisi menggunakan if dengan syarat jika (q yang memanggil pkanan tidak sama dengan null)
Nilai dari variable r yang bertipe data Node adalah q yang memanggill pKanan
Proses perulangan menggunakan while dengan syarat r.pKiri tidak sama dengan null
Maka nilai r adalah r yang memanggil pKiri
Mengembalikan nilai pada variable r
Pemilihan kondisi else jika syarat tidak dipenuhi
Deklarasi objek p dari tipe data Node yang bernilai q yang memanggil pInduk
Proses perulangan menggunakan while dengan syarat p != null dan q = p.pKanan
Maka nilai q adalah sama dengan p
Dan p sama dengan nilai q yang memanggil pInduk
Mengembalikan nilai pada variable p
Deklarasi main method
Membuat objek baru yang memanggil kelas AVLT dengan nama objek t
Perintah mencetak (("=================== AVL TREE===============")
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 3
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 4
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 6
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 5
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 15
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 10
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 20
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 17
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method sisipDt pada kelas AVLT dengan nilai 25, Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Perintah mencetak ("\n========= HAPUS NODE AVL TREE=============")
Objek t memanggil method remove pada kelas AVLT dengan nilai 3
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method remove pada kelas AVLT dengan nilai 6
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Objek t memanggil method remove pada kelas AVLT dengan nilai 17
Objek t memanggil method inOrderTraversal lalu perintah mencetak baris kosong
Perintah mencetak ("===========================================")
Perintah mencetak (" THANKS")
Perintah mencetak ("===========================================")
SCREENSHOT PROGRAM
KESIMPULAN
Jelaskan apa yang dimaksud dengan AVL tree?
AVL Tree adalah Binary Search Tree yang memiliki perbedaan tinggi/ level maksimal 1 antara subtree kiri dan subtree kanan. AVL Tree muncul untuk menyeimbangkan Binary Search Tree. Dengan AVL Tree, waktu pencarian dan bentuk tree dapat dipersingkat dan disederhanakan. Untuk menjaga tree tetap imbang, setelah penyisipan sebuah node, dilakukan pemeriksaan dari node baru root. Node pertama yang memiliki "balance factor" > 1 diseimbangkan. Proses penyeimbangan dilakukan dengan: Single rotation dan Double rotation
Jelaskan perbedaan BST dan AVL tree?
Perbedaan BST dan AVL tree
BST :
BST adalah Height Balanced p-tree yang artinya maksimum perbedaan height antara subtree kiri dan kanan adalah p.
Semua data dibagian kiri sub-tree dari node t selalu lebih kecil dari data dalam node t itu sendiri.
Semua data dibagian kanan sub-tree dari node t selalu lebih besar atau sama dengan data dalam node t.
AVL Tree
AVL Tree adalah height balanced 1-tree yang berarti maksimum perbedaan height antara subtree kiri dan kanan adalah satu.
Path pencarian lokasi untuk dilakukan operasi insert dimulai dari Root.
Adanya node pada search path yang balancenya TallLeft (tanda -) atau TallRight (tanda +) dan terletak paling dekat dengan node yang baru
Jelaskan penerapan struktur data AVL tree?
Penerapan struktur data AVL tree digunakan pada Binary Search Tree yang bertujuan untuk menyeimbangkan tree tersebut, sehingga waktu pencarian dan struktur tree dapat disederhanakan. AVL Tree dapat direpresentasikan dengan menggunakan Array maupun linked list. Contohnya untuk membuat program tingkatan pegawai dalam perusahaan dan silsilah keluarga.
Gambarkan Struktur data AVL tree?