Anda di halaman 1dari 19

LAPORAN PRAKTIKUM ALGORITMA DAN

STRUKTUR DATA
PROGRAM TEKNOLOGI INFORMASI DAN ILMU
KOMPUTER
UNIVERSITAS BRAWIJAYA
BAB : AVL TREE
NAMA : RIZKY MUHAMMAD
NIM : 145150200111085
TANGGAL : 02/12/2015
ASISTEN : - DWI NOVI SETIAWAN
-MUHAMMAD SYAFIQ

A. DEFINISI MASALAH

1. Tambahkan method untuk menghapus suatu node pada pohon AVL


2. 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?
3. Perbaikilah program di pada latihan 10.1 di atas menjadi sub-sub program dengan
menambahkan sub program putarKiri, putarKanan, putarKiriKanan, putarKananKiri.

B. SOURCE CODE

Node.java
1 package latihan_Bab10;
2 public class Node {
3 int data;
4 int tinggi;
5 Node pKiri;
6 Node pKanan;
7 Node pInduk;
8 public Node(int data, int tinggi, Node kiri, Node
kanan, Node induk) {
9 // TODO Auto-generated constructor stub
10 this.data=data;
11 this.tinggi=tinggi;
12 this.pKiri=kiri;
13 this.pKanan=kanan;
14 this.pInduk=induk;
15 }
16 }

AVLT1.java
1 package latihan_Bab10;
2 public class AVLT1 {
3 private Node root;
4 public AVLT1(){root = null;}
5 //cari dt di tree, mengembalikan true jika ditemukan
6 //dan false jika tidak
7 public void hapusNode(int dt) {
8 int sim=0;
9 int run=0;
10 Node del = root;
11 while (run==0){
12 if(dt == del.data){
13 if(del.pInduk==null){
14 hapusRoot(del);
15 }
16 else{
17 hapusNode(del, sim);
18 }
19 run=1;
20 }
21 else if(dt < del.data){
22 del = del.pKiri;
23 sim=0;
24 }
25 else{
26 del = del.pKanan;
27 sim=1;
28 }
29 }
30 }
31 public void hapusRoot(Node del) {
32 if(del.pKanan!=null){
33 if(del.pKanan.pKiri==null){
34 del.pKanan.pKiri=del.pKiri;
35 }
36 else{
37 Node temp1= del.pKanan.pKiri;
38 del.pKanan.pKiri=null;
39 while(temp1.pKiri!=null){
40 temp1=temp1.pKiri;
41 }
42 if(temp1.pKanan!=null){
43 Node temp1k= temp1.pKanan;
44 temp1.pKanan=del.pKanan;
45 temp1.pKiri=del.pKiri;
46 temp1.pInduk.pKanan=temp1k;
47 root=temp1;
48 }
49 else{
50 temp1.pKanan=del.pKanan;
51 temp1.pKiri=del.pKiri;
52 root=temp1;
53 }
54 }
55 }
56 else{
57 root=del.pKiri;
58 }
59 }
60 public void hapusNode(Node del,int sim) {
61 if(del.pKanan!=null){
62 if(del.pKanan.pKiri==null){
63 if(sim==0){
64 del.pInduk.pKiri=del.pKanan;
65 }
66 else if(sim==1){
67 del.pInduk.pKanan=del.pKanan;
68 }
69 }
70 else{
71 Node temp1= del.pKanan.pKiri;
72 del.pKanan.pKiri=null;
73 while(temp1.pKiri!=null){
74 temp1=temp1.pKiri;
75 }
76 if(temp1.pKanan!=null){
77 Node temp1k=temp1.pKanan;
78 temp1.pKanan=del.pKanan;
79 temp1.pKiri=del.pKiri;
80 temp1.pInduk.pKanan=temp1k;
81 if(sim==0){
82 del.pInduk.pKiri=temp1;
83 }
84 else if(sim==1){
85 del.pInduk.pKanan=temp1;
86 }
87 }
88 else{
89 temp1.pKanan=del.pKanan;
90 temp1.pKiri=del.pKiri;
91 if(sim==0){
92 del.pInduk.pKiri=temp1;
93 }
94 else{
95 del.pInduk.pKanan=temp1;
96 }
97 }
98 }
99 }
100 else{
101 if(sim==0){
102 del.pInduk.pKiri=del.pKiri;
103 }
104 else if(sim==1){
105 del.pInduk.pKanan=del.pKiri;
106 }
107 }
108 }
109 public boolean cariDt(int dt){
110 Node temp = root;
111 while(temp != null){
112 if(dt == temp.data) return true;
113 //cariDt subtree pKiri
114 else if(dt < temp.data) temp = temp.pKiri;
115 //cariDt subtree pKanan
116 else temp = temp.pKanan;
117 }
118 //dt tidak ditemukan
119 return false;
120 }
121 //sisip dt ke dalam tree, returns true if berhasil,
122 // false jika gagal
123 //tree diseimbangkan menggunakan algoritma AVL
124 public boolean sisipDt(int dt){
125 if(root == null){
126 //sisip dt di root
127 root = new Node(dt, 1, null, null, null);
128 return true;
129 }
130 //tree tidak kosong
131 else {
132 //mulai dari root
133 Node temp = root;
134 Node prev = null;
135 //cari lokasi penyisipan dt
136 while(temp != null){
137 if(dt == temp.data) {
138 return false;
139 }
140 //sisip dt di subtree pKiri
141 else if(dt < temp.data){
142 prev = temp;
143 temp = temp.pKiri;
144 }
145 //sisip dt di subtree pKanan
146 else {
147 prev = temp;
148 temp = temp.pKanan;
149 }
150 }
151 //buat node baru
152 temp = new Node(dt, 1, null, null, prev);
153 if(dt < prev.data){
154 prev.pKiri = temp;//sisip di pKiri
155
156 }
157 else{
158 prev.pKanan = temp; //sisipDt at pKanan
159 }
160 //Balancing
161 //mulai dari node yang disisipkan dan
162 //bergerak menuju root
163 balancing(temp);
164 //penyisipan berhasil
165 return true;
166 }
167 }
168 public void balancing(Node temp) {
169 while(temp != null){
170 //subtree pKiri dan pKanan memenuhi kondisi AVL
171 if(Math.abs(tinggi(temp.pKiri)-tinggi(temp.pKanan))<=1){
172 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
173 }
174 //kasus 1 algoritma AVL
175 //putar kanan
176 else if(tinggi(temp.pKiri)-tinggi(temp.pKanan) >= 2 &&
tinggi(temp.pKiri.pKiri) >= tinggi(temp.pKiri.pKanan))
177 {
178 rotateRight(temp);
179 }
180 //case 2 algoritma AVl
181 //putar Kiri
182 else if(tinggi(temp.pKanan)-
tinggi(temp.pKiri)>= 2 && tinggi(temp.pKanan.pKanan) >=
tinggi(temp.pKanan.pKiri))
183 {
184 Node baru = temp;
185 rotateLeft(baru);
186 }
187 //kasus 3 dari algoritma AVL
188 //putar kiri putar kanan
189 else if(tinggi(temp.pKiri)-
tinggi(temp.pKanan)>= 2 && tinggi(temp.pKiri.pKanan) >=
tinggi(temp.pKiri.pKiri))
190 {
191 rotateLeftRight(temp);
192 }
193 //kasus 4 dari algoritma AVL
194 //putar kanan putar kiri
195 else if(tinggi(temp.pKanan)-
tinggi(temp.pKiri)>= 2 && tinggi(temp.pKanan.pKiri) >=
tinggi(temp.pKanan.pKanan))
196 {
197 rotateRightLeft(temp);
198 }
199 temp = temp.pInduk;
200 }
201 }
202 public void rotateLeft(Node temp) {
203 Node parent = temp.pInduk;
204 Node pKanan = temp.pKanan;
205 temp.pKanan = pKanan.pKiri;
206 if(temp.pKanan != null) {
207 temp.pKanan.pInduk = temp;
208 }
209 pKanan.pKiri = temp;
210 temp.pInduk = pKanan;
211 pKanan.pInduk = parent;
212 if(parent == null) {
213 root = pKanan;
214 }
215 else if(parent.pKanan == temp) {
216 parent.pKanan = pKanan;
217 }
218 else {
219 parent.pKiri = pKanan;
220 }
221 //hitung tinggi subtree pKanan
222 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
223 temp = pKanan;
224 //hitung tinggi dari root
225 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
226 //rotateLeft(temp);
227 }
228 public void rotateRight(Node temp){
229 Node parent = temp.pInduk;
230 Node pKiri = temp.pKiri;
231 temp.pKiri = pKiri.pKanan;
232
233 if(temp.pKiri != null) temp.pKiri.pInduk =
temp;
234 pKiri.pKanan = temp;
235 temp.pInduk = pKiri;
236 pKiri.pInduk = parent;
237 if(parent == null) root = pKiri;
238 else if(parent.pKiri==temp)parent.pKiri =
pKiri;
239 else parent.pKanan = pKiri;
240 //hitung tinggi subtree pKanan
241 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
242 temp = pKiri;
243 //hitung tinggi dari root
244 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
245 //rotateRight(temp);
246 }
247 public void rotateLeftRight(Node temp) {
248 Node parent = temp.pInduk;
249 Node pKiripKanan = temp.pKiri.pKanan;
250
251 temp.pKiri.pKanan = pKiripKanan.pKiri;
252 if(temp.pKiri.pKanan!= null){
253 temp.pKiri.pKanan.pInduk = temp.pKiri;
254 }
255 pKiripKanan.pKiri = temp.pKiri;
256 temp.pKiri.pInduk = pKiripKanan;
257 temp.pKiri = pKiripKanan.pKanan;
258 if(temp.pKiri != null){
259 temp.pKiri.pInduk = temp;
260 }
261 pKiripKanan.pKanan = temp;
262 temp.pInduk = pKiripKanan;
263 pKiripKanan.pInduk = parent;
264 if(parent == null) {
265 root = pKiripKanan;
266 }
267 else if(parent.pKiri==temp) {
268 parent.pKiri = pKiripKanan;
269 }
270 else{
271 parent.pKanan = pKiripKanan;
272 }
273 //hitung tinggi subtree pKanan
274 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
275 temp = pKiripKanan;
276 //hitung tinggi dari root
277 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
278 }
279 public void rotateRightLeft(Node temp) {
280 Node parent = temp.pInduk;
281 Node pKananpKiri = temp.pKanan.pKiri;
282 temp.pKanan.pKiri = pKananpKiri.pKanan;
283 if(temp.pKanan.pKiri!= null){
284 temp.pKanan.pKiri.pInduk = temp.pKanan;
285 }
286 pKananpKiri.pKanan = temp.pKanan;
287 temp.pKanan.pInduk = pKananpKiri;
288 temp.pKanan = pKananpKiri.pKiri;
289 if(temp.pKanan != null) {
290 temp.pKanan.pInduk = temp;
291 }
292 pKananpKiri.pKiri = temp;
293 temp.pInduk = pKananpKiri;
294 pKananpKiri.pInduk = parent;
295 if(parent == null) {
296 root = pKananpKiri;
297 }
298 else if(parent.pKanan == temp){
299 parent.pKanan = pKananpKiri;
230 }
231 else {
232 parent.pKiri = pKananpKiri;
233 }
234 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
235 temp = pKananpKiri;
236 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
237 }
238 public int tinggi(){
239 return root.tinggi;
240 }
241 private int tinggi(Node node){
242 if(node == null)return 0;
243 else return node.tinggi;
244 }
245 //hitung node-node dari tree
246 public int jumlahNode() {
247 return jumlahNode(root);
248 }
249 public void inOrderTraversal(){
250 inOrder(root);
251 }
252 private void inOrder(Node r){
253 if (r == null)return;
254 inOrder(r.pKiri);
255 System.out.printf("-%d",r.data);
256 inOrder(r.pKanan);
257 }
258 //hitung node-node dari tree
259 private int jumlahNode(Node node){
260 if(node == null) {
261 return 0;
262 }
263 else {
264 return 1 +jumlahNode(node.pKiri)
+jumlahNode(node.pKanan);
265 }
266
267 }
268 public static void main (String[] args) {
269 AVLT1 t = new AVLT1();
270 t.sisipDt(3);
271 t.inOrderTraversal();System.out.println();
272 t.sisipDt(4);
273 t.inOrderTraversal();System.out.println();
274 t.sisipDt(6);
275 t.inOrderTraversal();System.out.println();
276 t.sisipDt(5);
277 t.inOrderTraversal();System.out.println();
278 t.sisipDt(15);
279 t.inOrderTraversal();System.out.println();
280 t.sisipDt(10);
281 t.inOrderTraversal();System.out.println();
282 t.sisipDt(20);
283 t.inOrderTraversal();System.out.println();
284 t.sisipDt(17);
285 t.inOrderTraversal();System.out.println();
286 t.sisipDt(25);t.inOrderTraversal();System.out.println
();
287 System.out.println();
288 System.out.println("Hapus 25");
289 t.hapusNode(25);t.inOrderTraversal();System.out.println();
290 System.out.println("Hapus 3");
291 t.hapusNode(3);t.inOrderTraversal();System.out.println();
292 }
293 }

Method Hapus Node

7 public void hapusNode(int dt) {


8 int sim=0;
9 int run=0;
10 Node del = root;
11 while (run==0){
12 if(dt == del.data){
13 if(del.pInduk==null){
14 hapusRoot(del);
15 }
16 else{
17 hapusNode(del, sim);
18 }
19 run=1;
20 }
21 else if(dt < del.data){
22 del = del.pKiri;
23 sim=0;
24 }
25 else{
26 del = del.pKanan;
27 sim=1;
28 }
29 }
30 }
31 public void hapusRoot(Node del) {
32 if(del.pKanan!=null){
33 if(del.pKanan.pKiri==null){
34 del.pKanan.pKiri=del.pKiri;
35 }
36 else{
37 Node temp1= del.pKanan.pKiri;
38 del.pKanan.pKiri=null;
39 while(temp1.pKiri!=null){
40 temp1=temp1.pKiri;
41 }
42 if(temp1.pKanan!=null){
43 Node temp1k= temp1.pKanan;
44 temp1.pKanan=del.pKanan;
45 temp1.pKiri=del.pKiri;
46 temp1.pInduk.pKanan=temp1k;
47 root=temp1;
48 }
49 else{
50 temp1.pKanan=del.pKanan;
51 temp1.pKiri=del.pKiri;
52 root=temp1;
53 }
54 }
55 }
56 else{
57 root=del.pKiri;
58 }
59 }
60 public void hapusNode(Node del,int sim) {
61 if(del.pKanan!=null){
62 if(del.pKanan.pKiri==null){
63 if(sim==0){
64 del.pInduk.pKiri=del.pKanan;
65 }
66 else if(sim==1){
67 del.pInduk.pKanan=del.pKanan;
68 }
69 }
70 else{
71 Node temp1= del.pKanan.pKiri;
72 del.pKanan.pKiri=null;
73 while(temp1.pKiri!=null){
74 temp1=temp1.pKiri;
75 }
76 if(temp1.pKanan!=null){
77 Node temp1k=temp1.pKanan;
78 temp1.pKanan=del.pKanan;
79 temp1.pKiri=del.pKiri;
80 temp1.pInduk.pKanan=temp1k;
81 if(sim==0){
82 del.pInduk.pKiri=temp1;
83 }
84 else if(sim==1){
85 del.pInduk.pKanan=temp1;
86 }
87 }
88 else{
89 temp1.pKanan=del.pKanan;
90 temp1.pKiri=del.pKiri;
91 if(sim==0){
92 del.pInduk.pKiri=temp1;
93 }
94 else{
95 del.pInduk.pKanan=temp1;
96 }
97 }
98 }
99 }
100 else{
101 if(sim==0){
102 del.pInduk.pKiri=del.pKiri;
103 }
104 else if(sim==1){
105 del.pInduk.pKanan=del.pKiri;
106 }
107 }
108 }

Method putarKiri

202 public void rotateLeft(Node temp) {


203 Node parent = temp.pInduk;
204 Node pKanan = temp.pKanan;
205 temp.pKanan = pKanan.pKiri;
206 if(temp.pKanan != null) {
207 temp.pKanan.pInduk = temp;
208 }
209 pKanan.pKiri = temp;
210 temp.pInduk = pKanan;
211 pKanan.pInduk = parent;
212 if(parent == null) {
213 root = pKanan;
214 }
215 else if(parent.pKanan == temp) {
216 parent.pKanan = pKanan;
217 }
218 else {
219 parent.pKiri = pKanan;
220 }
221 //hitung tinggi subtree pKanan
222 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
223 temp = pKanan;
224 //hitung tinggi dari root
225 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
226 //rotateLeft(temp);
227 }

Method putarKanan

228 public void rotateRight(Node temp){


229 Node parent = temp.pInduk;
230 Node pKiri = temp.pKiri;
231 temp.pKiri = pKiri.pKanan;
232 if(temp.pKiri != null) temp.pKiri.pInduk = temp;
233
234 pKiri.pKanan = temp;
235 temp.pInduk = pKiri;
236 pKiri.pInduk = parent;
237 if(parent == null) root = pKiri;
238 else if(parent.pKiri==temp)parent.pKiri =
pKiri;
239 else parent.pKanan = pKiri;
240 //hitung tinggi subtree pKanan
241 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
242 temp = pKiri;
243 //hitung tinggi dari root
244 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
245 //rotateRight(temp);
246 }

Method putarKananKiri

279 public void rotateRightLeft(Node temp) {


280 Node parent = temp.pInduk;
281 Node pKananpKiri = temp.pKanan.pKiri;
282 temp.pKanan.pKiri = pKananpKiri.pKanan;
283 if(temp.pKanan.pKiri!= null){
284 temp.pKanan.pKiri.pInduk = temp.pKanan;
285 }
286 pKananpKiri.pKanan = temp.pKanan;
287 temp.pKanan.pInduk = pKananpKiri;
288 temp.pKanan = pKananpKiri.pKiri;
289 if(temp.pKanan != null) {
290 temp.pKanan.pInduk = temp;
291 }
292 pKananpKiri.pKiri = temp;
293 temp.pInduk = pKananpKiri;
294 pKananpKiri.pInduk = parent;
295 if(parent == null) {
296 root = pKananpKiri;
297 }
298 else if(parent.pKanan == temp){
299 parent.pKanan = pKananpKiri;
230 }
231 else {
232 parent.pKiri = pKananpKiri;
233 }
234 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
235 temp = pKananpKiri;
236 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
237 }
Method putarKiriKanan

247 public void rotateLeftRight(Node temp) {


248 Node parent = temp.pInduk;
249 Node pKiripKanan = temp.pKiri.pKanan;
250
251 temp.pKiri.pKanan = pKiripKanan.pKiri;
252 if(temp.pKiri.pKanan!= null){
253 temp.pKiri.pKanan.pInduk = temp.pKiri;
254 }
255 pKiripKanan.pKiri = temp.pKiri;
256 temp.pKiri.pInduk = pKiripKanan;
257 temp.pKiri = pKiripKanan.pKanan;
258 if(temp.pKiri != null){
259 temp.pKiri.pInduk = temp;
260 }
261 pKiripKanan.pKanan = temp;
262 temp.pInduk = pKiripKanan;
263 pKiripKanan.pInduk = parent;
264 if(parent == null) {
265 root = pKiripKanan;
266 }
267 else if(parent.pKiri==temp) {
268 parent.pKiri = pKiripKanan;
269 }
270 else{
271 parent.pKanan = pKiripKanan;
272 }
273 //hitung tinggi subtree pKanan
274 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
275 temp = pKiripKanan;
276 //hitung tinggi dari root
277 temp.tinggi = Math.max(tinggi(temp.pKiri),
tinggi(temp.pKanan)) +1;
278 }
C. PEMBAHASAN

No. 1

Method hapusNode

7 Deklarasi method void hapusNode dengan parameter int dt


8 Deklarasi variable local int sim = 0 berfungsi untuk menentukan node terletak
dikiri atau kanan
9 Deklarasi variable run=0 untuk syarat agar while berjalan
10 Instansiasi Node del dengan nilai sama dengan root
11 Membuat perulangan while dengan syarat run sama dengan 0
12 Membuat seleksi if dengan syarat run sama dengan 0 maka
13 Membuat seleksi if dengan syarat del.pInduk bernilai sama dengan null maka
14 Memanggil method hapusRoot dengan parameter del
15 Penutup if
16 Else maka
17 Memanggil method hapus node dengan parameter del dan sim
18 Penutup else
19 Nilai run berganti menjadi 1 agar perulangan berhenti
20 Penutup if
21 Else if dengan syarat dt kurang dari del.data maka
22 Nilai del sama dengan del.pKiri
23 Nilai sim sama dengan 0
24 Penutup else if
25 Else maka
26 Nilai del berganti menjadi del.pKanan
27 Nilai sim sama dengan 1
28 Penutup else
29 Penutup while
30 Penutup method hapusNode dengan parameter int dt
31 Deklarasi method void hapusRoot dengan parameter del
32 Membuat seleksi dengan syarat del.pKanan tidak sama dengan null maka
33 Membuat seleksi dengan syarat del.pKanan.pKiri sama dengan null maka
34 Del.pKanan.pKiri sama dengan del.pKiri
35 Penutup if
36 Else maka
37 Deklarasi Node temp1 bernilai sama dengan del.pKanan.pKiri
38 Memberi nilai del.pKanan.pKiri sama dengan null
39 Membuat perulangan while dengan syarat temp1.pKiri tidak sama dengan null
40 Nilai temp1 berubah menjadi temp1.pKiri
41 Penutup while
42 Membuat seleksi dengan syarat temp1.pKanan tidak sama dengan null maka
43 Deklarasi Node temp1k dengan nilai temp1.pKanan
44 Memberi nilai temp1.pKanan sama dengan del.pKanan
45 Memberi nilai temp1.pKiri sama dengan del.pKiri
46 Memberi nilai temp1.pInduk.pKanan dengan temp1k
47 Mengubah nilai root menjadi temp1
48 Penutup if
49 Else maka
50 Memberi nilai temp1.pKanan menjadi del.pKanan
51 Memberi nilai temp1.pKiri menjadi del.pKiri
52 Mengubah nilai root menjadi temp1;
53 Penutup else
54 Penutup else
55 Penutup if
56 Else maka
57 Nilai root sama dengan del.pKiri
58 Penutup else
59 Penutup method hapusRoot
60 Deklarasi method hapusNode dengan parameter Node del dan int sim
61 Membuat seleksi if dengan syarat del.pKana tidak sama dengan null maka
62 Membuat seleksi dengan syarat del.pKanan.pKiri sama dengan null maka
63 Membuat seleksi if dengan syarat sim sama dengan 0
64 Memberi nilai del.pInduk.pKiri dengan del.pKanan
65 Penutup if
66 Else if dengan syarat sim sama dengan 1 maka
67 Memberi nilai del.pInduk.pKanan dengan del.pKanan
68 Penutup else if
69 Penutup if
70 Else maka
71 Membuat Node temp1 dengan nilai del.pKanan.pKiri
72 Memberi nilai del.pKanan.pKiri dengan null
73 Membuat perulangan while dengan syarat temp1.pKiri tidak sama dengan null
74 Memberi nilai temp1 dengan temp1.pKiri
75 Penutup while
76 Membuat seleksi if dengan syarat temp1.pKanan tidak sama dengan null maka
77 Deklarasi Node temp1k dengan nilai temp1.pKanan
78 Memberi nilai temp1.pKanan dengan del.pKanan
79 Memberi nilai temp1.pKrii dengan del.pKiri
80 Memberi nilai temp1.pInduk.pKanan dengan temp1l
81 Membuat seleksi if dengan syarat sim sama dengan 0 maka
82 Memberi nilai del.pInduk.pKiri dengan temp1
83 Penutup if
84 Else if dengan syarat sim sama dengan 1 maka
85 Memberi nilai del.pInduk.pKanan dengan temp1
86 Penutup else if
87 Penutup if
88 Else maka
89 Memberi nilai temp1.pKanan dengan del.pKanan
90 Memberi nilai temp1.pKiri dengan del.pKiri
91 Membuat seleksi if dengan syarat sim sama dengan 0 maka
92 Memberi nilai del.pIndukpKiri dengan temp1
93 Penutup if
94 Else maka
95 Memberi nilai del.pInduk.pKanan sama dengan temp1
96 Penutup else
97 Penutup else
98 Penutup else
99 Penutup if
100 Else maka
101 Membuat seleksi if dengan syarat sim sama dengan 0 maka
102 Memberi nilai del.pInduk.pKiri dengan del.pKiri
103 Penutup if
104 Else if dengan syarat sim sama dengan 1 maka
105 Memberi nilai del.pInduk.pKanan dengan del.pKiri
106 Penutup else if
107 Penutup else
108 Pentup method hapusNode

No. 2

Sebelum diubah letak pebalance-an terletak pada method sisipDt


Letak proses putar Kiri terletak pada baris 109-138. Pada proses ini dijelaskan
bahwa proses ini dilakukan jika terdapat node yang tinggi sebelah kanan maka
dilakukannya proses putar kiri
Letak proses putar Kanan terletak pada baris 81-107. Pada proses ini dijelaskan
bahwa proses ini dilakukan jika terdapat node yang tinggi sebelah kiri maka
dilakukannya proses putar kanan
Letak proses putar kirikanan terletak pada baris 140-175. Pada proses ini
dijelaskan bahwa proses ini dilakukan jika terdapat node yang mempunyai tinggi sebelah
tetapi mempunyai bentuk seperti siku yang node bawahnya terletak pada node kiri
Letak proses putar kanankiri terletak pada baris 177-211. Pada proses ini
dijelaskan bahwa proses ini dilakukan jika terdapat node yang mempunyai tinggi sebelah
tetapi mempunyai bentuk seperti siku yang node bawahnya terletak pada node kanan

No. 3

Method putar kiri


202 Deklarasi method rotateLeft dengan parameter Node temp
203 Deklarasi Node parent dengan nilai temp.pInduk
204 Deklarasi Node pKanan dengan nilai temp.pKanan
205 Memberi nilai temp.pKanan dengan pKanan.pKiri
206 Membuat seleksi if dengan syarat temp.pKanan tidak sama dengan null maka
207 Memberi nilai temp.pKanan.pInduk sama dengan temp
208 Penutup if
209 Memberi nilai pKanan.pKiri dengan temp
210 Memberi nilai temp.pInduk dengan pKanan
211 Memberi nilai pKanan.pInduk dengan parent
212 Membuat seleksi if dengan syarat parent sama dengan null
213 Memberi nilai root dengan pKanan
214 Penutup if
215 Else if dengan syarat parent.pKanan sama dengan temp
216 Memberi nilai parent.pKanan dengan pKanan
217 Penutup else if
218 Else maka
219 Memberi nilai parent.pKiri dengan pKanan
220 Penutup else
221 Comment
222 Memberi nilai temp.tinggi dengan nilai dari perbandingan nilai mana yang lebih
besar antar tinggi temp.pKiri dan tinggi temp.pKanan ditambah dengan 1
223 Memberi nilai temp dengan pKanan
224 Comment
225 Memberi nilai temp.tinggi dengan nilai dari perbandingan nilai mana yang lebih
besar antara tinggi temp.pKiri dan tinggi temp.pKanan ditambah dengan 1
226 Comment
227 Penutup method

Method putar kanan


228 Deklarasi method rotateRight dengan parameter Node temp
229 Deklarasi Node parent dengan nilai temp.pInduk
230 Deklarasi Node pKiri dengan nilai temp.pKiri
231 Memberi nilai temp.pKiri dengan pKanan.pKanan
232 Membuat seleksi if dengan syarat temp.pKiri tidak sama dengan null maka
Memberi nilai temp.pKiri.pInduk sama dengan temp
233
234 Memberi nilai pKiri.pKanan dengan temp
235 Memberi nilai temp.pInduk dengan pKiri
236 Memberi nilai pKiri.pInduk dengan parent
237 Membuat seleksi if dengan syarat parent sama dengan null
Memberi nilai root dengan pKiri
238 Else if dengan syarat parent.pKanan sama dengan temp
Memberi nilai parent.pKiri dengan pKiri
239 Else maka
Memberi nilai parent.pKanan dengan pKiri
240 Comment
241 Memberi nilai temp.tinggi dengan nilai dari perbandingan nilai mana yang lebih
besar antar tinggi temp.pKiri dan tinggi temp.pKanan ditambah dengan 1
242 Memberi nilai temp dengan pKiri
243 Comment
244 Memberi nilai temp.tinggi dengan nilai dari perbandingan nilai mana yang lebih
besar antara tinggi temp.pKiri dan tinggi temp.pKanan ditambah dengan 1
245 Comment
246 Penutup method

Method putar kananKiri


279 Deklarasi method rotateRightLeft dengan parameter Node temp
280 Deklarasi Node parent dengan nilai sama dengan temp.pInduk
281 Deklarasi Node pKananpKiri dengan nilai temp.pKanan.pKiri
282 Memberi nilai temp.pKanan.pKiri dengan nilai pKananpKiri.pKanan
283 Membuat seleksi if dengan syarat temp.pKanan.pKiri tidak sama dengan null
284 Memberi nilai temp.pKanan.pKiri.pInduk dengan temp.pKanan
285 Penutup if
286 Memberi nilai pKananpKiri.pKanan dengan temp.pKanan
287 Memberi nilai temp.pKanan.pInduk dengan pKananpKiri
288 Memberi nilai temp.pKanan dengan pKananpKiri.pKiri
289 Membuat seleksi if dengan syarat temp.pKanan tidak sama dengan null
290 Memberi nilai temp.pKanan.pInduk sama dengan temp
291 Penutup if
292 Memberi nilai pKananpKiri.pKiri dengan temp
293 Memberi nilai temp.pInduk dengan pKananpKiri
294 Memberi nilai pKananpKiri.pInduk dengan parent
295 Membuat seleksi if dengan syarat parent sama dengan null
296 Memberi nilai root dengan pKananpKiri
297 Penutup if
298 Else if dengan syarat parent.pKanan sama dengan temp maka
299 Memberi nilai parent.pKanan dengan pKananpKiri
230 Penutup if
231 Else maka
232 Memberi nilai parent.pKiri dengan pKananpKiri
233 Penutup else
234 Memberi nilai temp.tinggi dengan mencari nilai tinggi mana yang terbesar dari
temp.pKiri dan temp.pKanan ditambah dengan 1
235 Memberi nilai temp dengan pKananpKiri
236 Memberi nilai temp.tinggi dengan mencari nilai tinggi mana yang terbesar dari
temp.pKiri dan temp.pKanan ditambah dengan 1
237 Penutup method

Method putar kiriKanan


247 Deklarasi method rotateLeftRight dengan parameter Node temp
248 Deklarasi Node parent dengan nilai sama dengan temp.pInduk
249 Deklarasi Node pKiripKanan dengan nilai temp.pKiri.pKanan
250
251 Memberi nilai temp.pKiri.pKanan dengan nilai pKiripKanan.pKiri
252 Membuat seleksi if dengan syarat temp.pKiri.pKanan tidak sama dengan null
253 Memberi nilai temp.pKiri.pKanan.pInduk dengan temp.pKiri
254 Penutup if
255 Memberi nilai pKiripKanan.pKiri dengan temp.pKiri
256 Memberi nilai temp.pKiri.pInduk dengan pKiripKanan
257 Memberi nilai temp.pKiri dengan pKiripKanan.pKanan
258 Membuat seleksi if dengan syarat temp.pKiri tidak sama dengan null
259 Memberi nilai temp.pKiri.pInduk sama dengan temp
260 Penutup if
261 Memberi nilai pKiripKanan.pKanan dengan temp
262 Memberi nilai temp.pInduk dengan pKiripKanan
263 Memberi nilai pKiripKanan.pInduk dengan parent
264 Membuat seleksi if dengan syarat parent sama dengan null
265 Memberi nilai root dengan pKiripKanan
266 Penutup if
267 Else if dengan syarat parent.pKiri sama dengan temp maka
268 Memberi nilai parent.pKiri dengan pKiripKanan
269 Penutup else if
270 Else maka
271 Memberi nilai parent.pKanan dengan pKiripKanan
272 Penutup else
273 comment
274 Memberi nilai temp.tinggi dengan mencari nilai tinggi mana yang terbesar dari
temp.pKiri dan temp.pKanan ditambah dengan 1
275 Memberi nilai temp dengan pKiripKanan
276 comment
277 Memberi nilai temp.tinggi dengan mencari nilai tinggi mana yang terbesar dari
temp.pKiri dan temp.pKanan ditambah dengan 1
278 Penutup method
D. SCREENSHOT PROGRAM

AVL Tree
E. KESIMPULAN

AVL Tree adalah sebuah binary search tree yang mempunyai syarat bahwa setiap anak
kiri dan anak kanan hanya boleh mempunyai perbedaan tinggi maksimal satu. Sama seperti
BST, nilai yang diinsertkan atau disisipkan pada AVL tree jika nilai tersebut lebih kecil
dari pada induknya maka akan masuk ke anak kiri induk sedangkan jika nilai itu lebih besar
maka akan masuk ke sebelah kanan induk.
Perbedaan antara AVL dan BST adalah AVL mempunyai perbedaan tinggi maksimal
antara subtree kiri dan kanan maksimal 1, perbadaan lainnya adalah jika terjadi Worst Case
dari BST saat berntuk tree tidak balance, mengakibatkan operasi searching pada BST
menjadi O(n), tidak sebagaimana yang diharapkan yaitu O(log n). BST menggunakan lebih
sedikit memory dan melakukan proses yang lebih cepat dibanding dengan AVL tree.
Kegunaan dari AVL adalah seperi kegunaan dari tree sendiri yang berbeda hanyalah
syarat dari AVl tree. Penerapan nya antara lain diimplementasikan pada routing table pada
router, Data Compresion Code, diimplementasikan pada ekspresi parsers dan ekspresi
solvers, dan untuk menyelesaikan masalah pada database seperti halnya indexing.
Gambar Struktur data AVL adalah sebagai berikut

Anda mungkin juga menyukai