Modul Struktur Data 2016 1-7
Modul Struktur Data 2016 1-7
:: MODUL 1 ::
1. Objek
Semua benda yang ada di dunia nyata dapat dianggap sebagai
sebuah objek. Pada dasarnya ada dua karakteristik utama pada
sebuah objek, yaitu :
Setiap objek memiliki atribut sebagai status yang kemudian
disebut sebagai state.
Setiap objek memiliki tingkah laku yang kemudian disebut
sebagai behaviour.
Contoh sederhananya adalah : objek sepeda
Sepeda memiliki atribut (state) : pedal, roda, jeruji, dan warna.
Sepeda memiliki tingkah laku (behaviour) : kecepatannya menaik,
kecepatannya menurun, dan perpindahan gigi sepeda.
Dalam pengembangan perangkat lunak berorientasi objek, objek
dalam perangkat lunak akan menyimpan state-nya dalam variabel dan
menyimpan informasi tingkah laku (behaviour) dalam method-method
atau fungsi-fungsi/prosedur.
2. Class
Class berbeda dengan objek. Class merupakan prototipe yang
mendefinisikan variabel-variabel dan method-method secara umum.
Sedangkan objek pada sisi yang lain merupakan instansiasi dari suatu
kelas.
Contoh program Class:
class Buku {
String pengarang;
String judul;
void Isi(String isi1,String isi2) {
judul = isi1;
pengarang = isi2;
}
void CetakKeLayar() {
if(judul==null && pengarang==null)
return;
System.out.println("Judul
:
",pengarang : "+pengarang);
}
"+judul+
}
2
class Karangan {
public static void main(String[] args) {
Buku a,b,c,d;
a = b = c = d = new Buku();
a.Isi("Pemrograman Java","Asep Herman Suyanto");
a.CetakKeLayar();
b.Isi(null,null);
b.CetakKeLayar();
c.Isi(null,"Johan Prasetyo Hendriyanto");
c.CetakKeLayar();
d.Isi("Pemrograman Web",null);
d.CetakKeLayar();
}
}
3. Enkapsulasi
Dalam sebuah objek yang mengandung variabel-variabel dan
method-method, dapat ditentukan hak akses pada sebuah variabel
atau method dari objek. Pembungkusan variabel dan method dalam
sebuah objek dalam bagian yang terlindungi inilah yang disebut
dengan enkapsulasi.
Manfaat dari proses enkapsulasi adalah:
Modularitas
Kode sumber dari sebuah objek dapat dikelola secara
independen dari kode sumber objek yang lain.
Information Hiding
Karena kita dapat menentukan hak akses sebuah
variabel/method dari objek, dengan demikian kita bisa
menyembunyikan informasi yang tidak perlu diketahui objek
lain.
4. Inheritance
Class dapat didefinisikan dari referensi class lain yang telah
terdefinisi. Inheritance merupakan pewarisan atribut dan method pada
sebuah class yang diperoleh dari class yang telah terdefinisi tersebut.
Setiap subclass akan mewarisi state (variabel-variabel) dan behaviour
(method-method) dari superclass-nya. Subclass kemudian dapat
menambahkan state dan behaviour baru yang spesifik dan dapat pula
memodifikasi (override) state dan behaviour yang diturunkan oleh
superclass-nya.
3
class B extends A {
int z
void TampilkanJumlah() {
//subclass dapat mengakses member dari superclass
System.out.println("Jumlah : " + (x+y+z));
}
}
class Inheritance {
public static void main(String[] args) {
A VarsuperOb = new A();
B VarsubOb
= new B();
System.out.println("SuperClass");
VarsuperOb.x = 10;
VarsuperOb.y = 20;
VarsuperOb.TampilkanNilaixy();
System.out.println("SubClass");
//member superclass dapat diakses dari subclass nya
VarsubOb.x = 5;
VarsubOb.y = 4;
VarsubOb.TampilkanNilaixy();
System.out.println("SubClass Jumlah");
//member tambahan yang hanya ada dalam subclass
VarsubOb.z = 30;
VarsubOb.TampilkanJumlah();
System.out.println("SubClass");
VarsubOb.x = 15
VarsubOb.y = 14;
VarsubOb.TampilkanNilaixy();
System.out.println("SuperClass");
VarsuperOb.x = 10;
VarsuperOb.y = 20;
VarsuperOb.TampilkanNilaixy();
System.out.println("SubClass Jumlah");
VarsubOb.z = 60;
VarsubOb.TampilkanJumlah();
}
}
5. Polimorfisme
Kata polimorfisme yang berarti satu objek dengan banyak bentuk
yang berbeda, adalah konsep sederhana dalam bahasa
pemrograman berorientasi objek yang berarti kemampuan dari suatu
variabel referensi objek untuk memiliki aksi berbeda bila method yang
sama dipanggil, dimana aksi method tergantung dari tipe objeknya.
Kondisi yang harus dipenuhi supaya polimorfisme dapat
diimplementasikan adalah:
Method yang dipanggil harus melalui variabel dari basis class
atau superclass.
Method yang dipanggil harus juga menjadi method dari basis
class.
Signature method harus sama baik pada superclass maupun
subclass.
Method access attribute pada subclass tidak boleh lebih terbatas
dari basis class.
Contoh program Polimorfisme:
abstract class Bentuk {
int panjang;
protected int lebar;
public String getBentuk() {
return "Bentuk Dasar";
}
public abstract int hitungLuas();
}
class BujurSangkar extends Bentuk {
public BujurSangkar(int panjang1, int lebar1) {
this.panjang = panjang1;
this.lebar = lebar1;
}
public String getBentuk() {
return "Bentuk Bujur Sangkar";
}
public int hitungLuas() {
return panjang*lebar;
}
}
luas
Latihan
1. Selesaikan permasalahan berikut:
Buat class bernama Counter untuk menginstansiasi objek
yang mensimulasikan proses penghitungan. Class Counter
memiliki 1 atribut (instance variable) bernama count. Method
yang dimiliki oleh class Counter adalah:
initialize, tanpa parameter, yang digunakan untuk
menginisialisasi variable count dengan nilai 0.
getCount, tanpa parameter, yang digunakan untuk
mengembalikan nilai yang tersimpan di variable count.
reset, tanpa parameter, yang digunakan untuk
mengeset nilai variable count menjadi 0.
increment, tanpa parameter, yang digunakan untuk
menaikkan nilai variable count dengan 1.
7
Buat 3 objek dari class Buku (beri nama b1, b2, dan
b3). Untuk masing-masing objek buku tersebut,
inisialisasikan pasangan nama dan harganya (Anda
yang tentukan sendiri).
Panggil method toString pada ketiga objek buku
yang sudah Anda buat.
Cobalah bermain-main dengan method setBuku,
setHarga, dan toString untuk mengubah nama buku
dan harganya. Lakukan pada ketiga objek yang sudah
Anda buat. Apa kesimpulan yang Anda dapatkan?
:: MODUL 2 ::
ARRAY/ LARIK
Array adalah sekumpulan data yang memiliki tipe yang sama,
variabel yang sama dan tiap data dibedakan dengan indeks dalam
array tersebut. Indeks dari tiap array dimulai dengan indeks ke-0. Jadi
jika suatu array memiliki berisi 5 buah data maka indeks maksimal dari
array tersebut adalah 4. Manfaat dari array adalah untuk mengurangi
jumlah variabel yang digunakan. Array dapat berbentuk dimensi satu,
dua, tiga dan seterusnya tergantung kebutuhan dari pengguna.
0
100
1
200
2
300
3
400
4
500
contoh:
double[] arrayC; atau double arrayC[];
10
contoh:
arrayC = new double[6];
atau
tipe_data nm_variabel[] = new tipe_data[jml_elemen];
contoh:
int[] arrayA = new int[15]; atau
int arrayA[] = new int[15];
=
=
=
=
121;
2324;
300;
343;
11
Ini berarti bahwa variabel arrayKu terdiri dari 3 baris array berurutan
yang masing-masing baris array tersebut mempunyai 5 elemen yang
juga tersusun berurutan.
baris 0
baris 1
baris 2
kolom 0
[0][0]
[1][0]
[2][0]
kolom 1
[0][1]
[1][1]
[2][1]
kolom 2
[0][2]
[1][2]
[2][2]
Kolom 3
[0][3]
[1][3]
[2][3]
kolom 4
[0][4]
[1][4]
[2][4]
indeks = [baris][kolom]
12
13
Latihan
1. Deklarasikan satu array untuk menyimpan nilai mean, median dan
modus dari sekumpulan data (minimal 10 data)!
Contoh:
input = array data
output = array mean, median, modus
2. Buat operasi inverse matriks 3x3.
3. Buat operasi transpose matriks 3x2.
4. Buatlah program untuk melakukan evaluasi cuaca sebuah daerah
setiap hari, pekan maupun bulan selama satu tahun.
Parameternya dapat berupa suhu, kecepatan angin, dan tingkat
kelembaban. Program ini dapat menghasilkan nilai rata-rata dari
tiap parameter cuaca tersebut.
14
:: MODUL 3 ::
LINKED LIST
Linked List (Daftar Berkait) adalah suatu simpul (node) yang
dikaitkan dengan simpul yang lain dalam suatu urutan yang tertentu.
Suatu simpul dapat berbentuk suatu struktur (struct). Setiap simpul
memiliki dua kelompok elemen yaitu elemen data dan elemen pointer.
Suatu simpul harus mempunyai satu atau lebih elemen struktur yang
berupa pointer. Elemen struktur yang berupa pointer ini disebut
dengan kait (link).
3.1 Single Linked List
Single Linked List adalah linked list dimana setiap node hanya
menunjuk node selanjutnya (hanya memiliki satu elemen pointer).
Simpul
Elemen Data
Pointer
Simpul
Elemen Data
Pointer
Simpul
List
Elemen Data
NULL
Elemen
Data
Pointer
2
Simpul
List
Pointer
1
Elemen
Data
Pointer
2
Simpul
Pointer
1
Elemen
Data
NULL
15
}
}
public void view(){
LP3 tampil=kepala;
while(tampil!=null){
tampil.view();
tampil=tampil.next;
}
}
public void delete(String nama){
LP3 dat = kepala;
LP3 sbdat = buntut;
while (!dat.nama.equals(nama)) {
if (dat.next == null) {
System.out.println("Maaf data tidak ada");
return;
}
sbdat = dat;
dat = dat.next;
}
if (dat == sbdat) {
kepala = kepala.next;
} else if (dat == buntut) {
sbdat.next = null;
buntut = sbdat;
} else {
sbdat.next = dat.next;
}
System.out.println("Data berhasil dihapus");
}
void update(String nama) {
LP3 dat = kepala;
if(kepala == null){
System.out.println("maaf data tidak ada");
return;
}
while (!dat.nama.equals(nama)) {
if (dat.next == null) {
System.out.println("Maaf data tidak ada");
return;
}
dat = dat.next;
17
}
dat.input();
}
public static void main(String[] args) {
test tis=new test();
Scanner in=new Scanner (System.in);
int menu=1;
while(menu!=0){
System.out.println("\nMenu :");
System.out.println("1. Input");
System.out.println("2. View");
System.out.println("3. update");
System.out.println("4. delete");
System.out.println("5. Exit");
System.out.print("\nMasukkan menu : ");
menu=in.nextInt();
if (menu==1){
tis.input();
}
else if(menu==2){
tis.view();
}
else if(menu==3){
System.out.print("Masukkan nama data yang update :
");
String up = in.next();
tis.update(up);
}
else if(menu==4){
System.out.print("Masukkan nama data yang delete :
");
String del = in.next();
tis.delete(del);
}else if(menu==5){
menu=0;
System.out.println("EXIT");
}
else{
System.out.println("menu tidak ada");
}
}
}
18
Latihan
1. Gunakan implementasi Single Linked List yang sudah diberikan di
atas. Tugas Anda:
Buatlah sebuah program yang menggunakan Single Linked
List untuk menyimpan elemen informasi mahasiswa berupa
NPM dan Nama. (Petunjuk: Anda dapat menggunakan Struct).
Masukkan beberapa data mahasiswa ke dalam linked list dan
tampilkan hasilnya.
Coba hapus beberapa data mahasiswa dari linked list dan
tampilkan hasilnya.
2. Modifikasi implementasi Single Linked List pada contoh di atas
dengan menambahkan method untuk menyisipkan data baru di
depan/bagian head (prepend).
3. Modifikasi implementasi Single Linked List pada contoh di atas
dengan menambahkan method untuk menghapus data di
depan/bagian head.
4. Modifikasi implementasi Single Linked List pada contoh di atas
menjadi Double Linked List. Tugas Anda:
Modifikasi method untuk menambahkan NODE baru ke dalam
linked list.
Modifikasi method untuk menghapus sebuah NODE dari
linked list.
5. Sama dengan nomor 2, tetapi modifikasikan contoh menjadi
Circular Single Linked List.
6. Sama dengan nomor 2, tetapi modifikasikan contoh menjadi
Circular Double Linked List.
7. Buatlah sebuah program simulasi: Nasabah yang tiba di Bank.
Ketika seorang nasabah sampai di bank, kemudian mereka
mengambil tempat pada antrian nasabah, menunggu dipanggil
oleh kasir (teller). Pihak bank bermaksud melakukan survei waktu
rata-rata yang dihabiskan seorang nasabah di antrian. Untuk itu,
seorang nasabah yang datang diberi tiket yang mencatat waktu
kedatangan, tiket ini diberikan kepada teller bank ketika si
nasabah telah mencapai antrian paling depan atau telah dipanggil
oleh teller. Setiap node pada antrian harus memiliki informasi
berikut ini :
ID Nasabah [a sequential number]
19
Waktu kedatangan
Waktu keberangkatan
8. Buatlah program untuk melakukan manipulasi string, tiap karakter
satu node. Pengguna bisa memasukkan string apapun, dan bisa
melakukan beberapa operasi manipulasi string sebagai berikut :
Memeriksa apakah string merupakan string yang jika dibolak
balik memilki arti yang sama, misal : malam malam : OK.
Membalik sebuah string, misal : praktikum algoritma dan
struktur data atad rutkurts nad amtirogla mukitkarp : OK.
Menyisipkan string di karakter ke-x, misal : aku informatika,
masukkan pada karakter ke-5, kata 'mahasiswa ' aku
mahasiswa informatika : OK.
Mencari sub string, misal : aku kua aku senang pemrograman,
cari substring aku, hasilnya = 2 : OK.
Secara umum list ini harus memiliki fungsi-fungsi berikut : tambah
satu karakter di belakang, hapus paling belakang, hapus paling
depan, cetak list, dan hapus list. Untuk mempermudah buatlah
dengan double linked list.
9. Buatlah database siswa yang mengikuti praktikum dengan struktur
data sebagai berikut:
ID Siswa
Nama Siswa
Kelas
Jadwal Praktikum //berisi hari dan jam
Jumlah Modul yang telah diselesaikan modul [8]
//jumlah
modul yang harus diselesaikan adalah 8
untuk elemen data modul berupa linked list lagi yang berisi :
o State Pengerjaan Modul
o No Modul
o Nilai Modul
o Asisten Modul
o Absensi
//kehadiran pada saat praktikum
Method-method yang harus ada :
insert siswa praktikum baru.
edit data praktikum siswa.
lihat data seluruh siswa yang mengikuti praktikum.
lihat detail siswa dengan modulnya.
20
21
:: MODUL 4 ::
STACK/ TUMPUKAN
Salah satu konsep yang sangat bermanfaat dalam ilmu komputer
adalah stack. Stack adalah koleksi item/ data yang terurut dimana item
baru akan dimasukkan atau item lama akan dihapus melalui satu
ujung/ jalan, dikenal dengan nama top dari stack. Stack bersifat
dinamis, artinya item/ data yang tidak terpakai bisa dihapus.
PUSH( )
BOTTOM
F
E
D
C
B
A
Stack
TOP
}
public boolean isOperator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch
== '^') {
return true;
}
return false;
}
public int degreeOp(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else if (op == '^') {
return 3;
} else {
return 0;
}
}
public String toPostfix() {
char ch;
for (int i = 0; i < infixExp.length(); i++) {
ch = infixExp.charAt(i);
if (isOperator(ch)) {
if (s.isEmpty() || degreeOp(ch) >
degreeOp(s.peek())) { //perbandingan derajat relasi
s.push(ch);
} else {
postfixExp += s.pop();
do {
if (s.isEmpty() || degreeOp(ch) >
degreeOp(s.peek())) {
break;
} else {
//System.out.println(ch);
postfixExp += s.pop();
}
} while (degreeOp(ch) <= degreeOp(s.peek()));
//perbandingan derajat relasi
s.push(ch);
}
} else if (ch == ')') {
do {
23
postfixExp += s.pop();
} while (s.peek() != '(');
s.pop();
} else if (ch == '(') {
s.push(ch);
} else {
postfixExp += ch;
}
}
if (!s.isEmpty()) {
do {
postfixExp += s.pop();
} while (!s.isEmpty());
}
return postfixExp;
}
}
class TestInfixToPostfix {
public static void main(String[] args) {
infix itp = new infix();
String infix;
Scanner keyIn = new Scanner(System.in);
//(a+b)/((c-d)*e^f)
//(A+B)/((C-D)*E^F)
System.out.print("Infix Expression : ");
infix = keyIn.nextLine();
itp.setInfixExp(infix);
System.out.println("Postfix Expression : " +
itp.toPostfix());
}}
24
package TP4;
import java.util.Scanner;
import java.util.Stack;
public class TP4 {
static Stack S = new Stack();
static Scanner in = new Scanner(System.in);
static String a,dibalik = "";
static int max_st;
static String top ;
static void pushh(Stack S, String a){
a = (String) S.push(a);
}
static void popp(Stack S, String a ){
a = (String) S.pop();
System.out.println("stack: " + S);
}
public static void main(String[] args) {
System.out.print("Masukkan Max_Stack : ");
max_st=in.nextInt();
for (int i = 0; i < max_st; i++) {
System.out.print("PUSH -> ");
a=in.next();
pushh(S, a);
}
System.out.println(S);
System.out.println("POP
=
y
/
anykeys=stop");
while(!a.equals("n")){
System.out.print("POP -> ");
a=in.next();
if (a.equals("y") && !S.isEmpty()) {
popp(S, a);
}else{
System.out.println("apa
stack
"+S.isEmpty());
break;
}
System.out.println("apa stack kosong?
"+S.isEmpty());
if (S.isEmpty()) {
System.out.println("stop");
kosong?
25
break;
}
}
}}
Latihan
Dengan menggunakan contoh class Stack di atas, kerjakan soal no 1
sampai 10. Anda mungkin perlu melakukan modifikasi terhadap class
Stack.
1. Buatlah program untuk menerima masukan berupa sebuah
persamaan matematis bertanda kurung dan kemudian melakukan
pengecekan apakah pemakaian tanda kurungnya sudah tepat
ataukah belum. Jika belum tepat maka tunjukkan letak
kesalahannya ada di mana. Gunakanlah tipe struktur data STACK.
2. Buatlah program untuk mengevaluasi hasil operasi sebuah
persamaan matematis dalam format POSTFIX tanpa kurung yang
dimasukkan oleh user. Gunakanlah struktur data tipe STACK.
3. Buatlah program untuk mengkonversi persamaan matematis
format INFIX ke dalam format POSTFIX. Gunakanlah tipe struktur
data STACK.
4. TOWER OF HANOI
Buatlah
sebuah
program
Menara
Hanoi
yang
mengimplementasikan stuktur data stack dengan menggunakan
linked list, tanpa menerapkan rekursi di dalamnya. Input program
berupa jumlah piringan (discs), outputnya berupa langkah-langkah
perpindahan piringan dari menara asal ke menara tujuan.
Contoh : Ilustrasikan perpindahan piringan dari menara asal (A)
ke menara tujuan (C) dengan bantuan menara bantu (B) yang
terletak di antara menara A dan C.
Input
: 3 piringan
Output : A C
AB
CB
AC
BA
BC
AC
5. POSTFIX INTERPRETER
26
29
:: MODUL 5 ::
QUEUE/ ANTRIAN
Selain stack, konsep struktur yang juga sering dipakai dalam ilmu
computer adalah queue/ antrian. Sama dengan stack, struktur data
queue dikembangkan dari struktur data Linked List ataupun Array.
Yang membedakan queue dengan stack adalah mode
pengaksesan data/ itemnya. Queue dikenal dengan istilah FIFO, First
In First Out. Konsep tersebut berarti bahwa item data yang pertama
kali masuk ke dalam antrian/ queue maka item data tersebutlah yang
akan dikeluarkan pertama kali. Dan sebaliknya jika sebuah item data
masuk ke dalam antrian yang terakhir kali, maka item tersebut akan
keluar juga paling akhir.
Remove( )
Insert( )
Queue
A
Front
Back
30
31
package TP4;
import java.util.Scanner;
public class TP4 {
private String data[][];
private int size;
private int last;
public TP4(int n) {
data = new String[n][3];
size = n;
last = -1;
}
public boolean isFull() {
return last == (size - 1) ? true : false;
}
public boolean isEmpty() {
return last == -1 ? true : false;
}
public void enQueue(String meja, String makanan, String
minuman) {
if (!isFull()) {
int id = ++last;
data[id][0] = meja;
32
data[id][1] = makanan;
data[id][2] = minuman;
} else {
System.out.println("Maaf, data penuh");
}
}
public void deQueue() {
if (!isEmpty()) {
System.out.println("Data terhapus");
for (int i = 0; i < last; i++) {
data[i][0] = data[i + 1][0];
data[i][1] = data[i + 1][1];
data[i][2] = data[i + 1][2];
}
data[last][0] = "";
data[last][1] = "";
data[last][2] = "";
last--;
} else {
System.out.println("Empty !");
}
}
public void cetak(String kom) {
System.out.println(kom);
System.out.println("Antrian "+" | "+ "Meja "
| " + "Makanan"
+"
| "+ "Minuman"
+"
|");
for (int i = 0; i <= last; i++) {
System.out.println(
i+1 +"\t"
+"|"+
data[i][0] +"\t"+ " | " + data[i][1]+"\t"+"
| "+
data[i][2]+"\t"+"
|");
}
}
+ "
33
System.out.print("Menu\n1.EnQueue\n2.DeQueue\n3.Print\n4.Exit
\n"
+ "Pilihan: ");
pilih=in.nextInt();
switch (pilih) {
case 1:
in.nextLine();
System.out.print("Masukkan No. Meja : ");
String meja = in.nextLine();
System.out.print("Masukkan Makanan : ");
String makanan = in.nextLine();
System.out.print("Masukkan Minuman : ");
String minuman = in.nextLine();
que.enQueue(meja, makanan, minuman);
System.out.println();
break;
case 2:
que.deQueue();
System.out.println();
break;
case 3:
que.cetak("Cetak");
System.out.println();
break;
case 4:
System.exit(0);
default:
System.out.println("Tidak ada pada
pilihan");
break;
}
}
}
}
Latihan
Dengan menggunakan contoh class Queue di atas, kerjakan soal no
1 dan 2. Anda mungkin perlu melakukan modifikasi terhadap class
Queue.
1. Buatlah program untuk menampilkan proses simulasi kinerja CPU
sebuah komputer dalam menangani proses-proses transaksi yang
34
35
:: MODUL 6 ::
BINARY TREE DAN BINARY SEARCH TREE
1.1 Tree (Pohon)
Jika Stack dan Queue merupakan Tipe Data Abstrak yang bersifat
linier (tersusun berurutan), maka Tree adalah Tipe Data Abstrak yang
bersifat hirarki (bertingkat). Contoh sebuah tree adalah struktur
organisasi dalam perusahaan. President disebut root/akar dari tree
sedangkan Clerk disebut leaf/daun dari tree.
36
tersebut ke leaf dan Tinggi (height) dari sebuah tree adalah tinggi dari
node root-nya.
Bentuk tree yang paling popular adalah Binary Tree, yakni tree
yang tiap node-nya memiliki maksimal 2 node di bawahnya. Binary
Tree dapat digunakan untuk merepresentasikan ekspresi matematika
dengan operator biner, seperti penjumlahan, pengurangan, perkalian,
dan pembagian.
Karakteristik dari sebuah Binary Tree:
1. Binary Tree dengan tinggi h 0 memiliki paling banyak 2 h+1 1
node internal.
2. Sebaliknya, tinggi dari binary tree dengan n node internal
setidaknya 2 + 1 1
3. Binary tree dengan tinggi h 0 memiliki paling banyak 2h daun.
4. Sebaliknya, binary tree dengan l daun, memiliki tinggi 2
1.2 Penelusuran Tree
Merupakan algoritma untuk menelusuri tree dan melakukan
sejumlah komputasi/perhitungan pada setiap node-nya. Ada dua
metode utama:
1. Penelusuran Depth-First (bersifat rekursif):
Penelusuran Pre-Order: Kunjungi root, telusuri subtree kiri,
telusuri subtree kanan
Penelusuran In-Order: Telusuri subtree kiri, kunjungi root,
telusuri subtree kanan
Penelusuran Post-Order: Telusuri subtree kiri, telusuri subtree
kanan, kunjungi root
Contoh Tree:
In-Order:
Post-Order:
A-B-C-D-E-F-G-H-I
B-C-A-F-E-G-D-I-H
C-B-F-G-E-I-H-D-A
37
38
39
hasil = hasil +
postOrder(ptrSimpul.kiri);
if (ptrSimpul.kanan != null)
hasil = hasil +
postOrder(ptrSimpul.kanan);
hasil = hasil + ptrSimpul.data;
}
else{
System.out.println("Data tidak ada");
}
return hasil;
}
public String postOrder() {
return postOrder(akar);
}
public boolean hapus(char data) {
SimpulPohon simpulDihapus = cari(akar, data);
if (simpulDihapus == null) {
return true;
}
if (simpulDihapus.kanan == null)
if (simpulDihapus.kiri == null) {
if (simpulDihapus == akar)
akar = null;
else
if (simpulDihapus.induk.kiri ==
simpulDihapus)
simpulDihapus.induk.kiri = null;
else
simpulDihapus.induk.kanan =
null;
}
else {
if (simpulDihapus == akar) {
akar = simpulDihapus.kiri;
akar.induk = null;
}
else {
if (simpulDihapus.induk.kiri ==
simpulDihapus) {
simpulDihapus.induk.kiri =
simpulDihapus.kiri;
43
simpulDihapus.kiri.induk =
simpulDihapus.induk;
}
else {
simpulDihapus.induk.kanan =
simpulDihapus.kiri;
simpulDihapus.kiri.induk =
simpulDihapus.induk;
}
}
}
else
if (simpulDihapus.kiri == null) {
if (simpulDihapus == akar) {
akar = simpulDihapus.kanan;
akar.induk = null;
}
else
if (simpulDihapus.induk.kiri ==
simpulDihapus) {
simpulDihapus.induk.kiri =
simpulDihapus.kanan;
simpulDihapus.kanan.induk =
simpulDihapus.induk;
}
else {
simpulDihapus.induk.kanan =
simpulDihapus.kanan;
simpulDihapus.kanan.induk =
simpulDihapus.induk;
}
}
else {
SimpulPohon pengganti =
simpulDihapus.kanan;
while (pengganti.kiri != null)
pengganti = pengganti.kiri;
if (pengganti.induk.kiri == pengganti) {
pengganti.induk.kiri =
pengganti.kanan;
if (pengganti.kanan != null)
pengganti.kanan.induk =
pengganti.induk;
}
44
else {
pengganti.induk.kanan =
pengganti.kanan;
if (pengganti.kanan != null)
pengganti.kanan.induk =
pengganti.induk;
}
simpulDihapus.data = pengganti.data;
simpulDihapus = pengganti;
}
return true;
}
public void hapusSemuaSimpul() {
akar = null;
}
public boolean kosong() {
return akar == null;
}
}
public class Tupen6 {
static SimpulPohon pohon = new SimpulPohon('0');
static Scanner in=new Scanner(System.in);
static int menu=1,pilih=1;
static String huruf;
public static void input(){
System.out.println("Masukkan Huruf");
huruf =in.next();
}
public static void menu(){
while(menu!=4){
System.out.print("Menu\n1.Input\n2.View\n3.Delete\n4.Exi
t\n");
System.out.println("Masukkan menu: ");
menu =in.nextInt();
switch(menu){
case 1:
input();
for (int i = 0; i < huruf.length(); i++) {
if (pohon.sisip(huruf.charAt(i)) ==
false)
System.out.println("Data " +
huruf.charAt(i) +" sudah ada");
else
45
System.out.println("Data " +
huruf.charAt(i) +" disimpan");
}
break;
case 2:
menu2();
break;
case 3:
System.out.println("Masukkan data yang
dihapus: ");
char del =in.next().charAt(0);
if (pohon.kosong())
System.out.println("Pohon kosong");
else
pohon.hapus(del);
break;
case 4:
System.out.println("Terimah Kasih");
System.exit(0);
break;
default :
System.out.println("Pilih kembali");
break;
}}}
public static void menu2(){
while(pilih!=0){
System.out.print("Menu\n1.PreOreder\n2.inOrder\n3.postOr
der\n4.Exit\n");
System.out.println("Masukkan pilihan");
pilih =in.nextInt();
switch(pilih){
case 1:
System.out.println("PreOrder: " +
pohon.preOrder());
break;
case 2:
System.out.println("InOrder: " +
pohon.inOrder());
break;
case 3:
System.out.println("PostOrder: " +
pohon.postOrder());
break;
46
default:
menu();
break;
} }}
public static void main(String[] args) {
menu();
}}
Latihan
1. Pelajari class BinaryTreeTest di atas serta Jelaskan ada
berapa method dan method apa saja yang dimiliki oleh class
tersebut?
2. Tambahkan method delete untuk menghapus node dari tree!
3. Modifikasi method printInOrder untuk membuat method
printPreOrder dan printPostOrder!
47
:: MODUL 7 ::
SORTING/PENGURUTAN
Konsep sebuah himpunan elemen/ data yang terurut mempunyai
pengaruh yang cukup penting dalam kehidupan sehari-hari. Sebagai
contoh adalah proses pencarian sebuah nomer telepon di buku
alamat. Faktanya adalah bahwa nama-nama di dalam buku tersebut
telah ditulis urut berdasar alphabet. Contoh lain, ketika seseorang
mencari sebuah buku di perpustakaan. Karena buku sudah diberi
kode dan menempati lokasi tertentu berdasar urutan maka buku
tersebut dapat ditemukan dalam waktu yang relatif dapat diperkirakan.
Jadi secara umum, sebuah himpunan elemen disimpan terurut untuk
mempermudah dalam membuat laporan atau untuk membuat akses
mesin ke data lebih efisien.
Proses
sorting
dilakukan
dengan
teknik
perulangan
dikombinasikan dengan pemakaian tipe data yang memungkinkan
proses pengurutan (data mampu diakses secara sekuensial),
misalnya array, array of struct, linked list, dan sebagainya. Sebelum
melakukan sorting maka harus ditentukan terlebih dahulu field key
(kunci) yang akan dipakai sebagai acuan. Selanjutnya dilakukan loop
untuk membandingkan nilai sebuah elemen dengan nilai elemenelemen lainnya. Proses tersebut diulang terus sampai semua elemen
terakses.
Record 1
Record 2
Record 3
Record 4
Record 5
Key
1
2
3
4
5
Other
fields
WWW
FFF
YYY
AAA
GGG
Key
4
2
1
5
3
Other fields
AAA
FFF
WWW
GGG
YYY
Original file
Key
Sorted file
AAA
FFF
GGG
WWW
YYY
Other
fields
4
2
5
1
3
48
Latihan
1. Diketahui sebuah deretan angka sebagai berikut:
2, 8, 4, 3, 5, 1, 9, 7, 6
Simulasikan sorting dengan algoritma Bubble Sort
Simulasikan sorting dengan algoritma Selection Sort
Simulasikan sorting dengan algoritma Insertion Sort
Simulasikan sorting dengan algoritma Merge Sort
Simulasikan sorting dengan algoritma Quick Sort
Simulasikan sorting dengan algoritma Heap Sort
Catatan: Simulasi berarti menampilkan perubahan deretan
angka mulai dari awal sampai terurut secara tahap demi tahap.
2. PT Maju Sejahtera yang bergerak dalam bidang konveksi
memiliki data karyawan yang berisi data NIK (Nomor Induk
Karyawan), Nama, Tempat dan Tanggal Lahir, Alamat, dan Jenis
Kelamin. Pihak manajemen menginginkan data seluruh karyawan
tersebut bisa diketahui (ditampilkan di layar monitor) secara urut
berdasarkan NIK, Nama, Alamat maupun Jenis Kelaminnya
sesuai menu pengurutan yang dipilih.
Tugas:
Kerjakan dengan metode Bubble Sort.
Kerjakan dengan metode Straight Selection Sort.
Kerjakan dengan metode Insertion Sort.
Catatan: Buatlah terlebih dahulu method untuk melakukan
input data. Algoritma bisa dicari di buku referensi atau di
internet (pakai search engine). Untuk menyimpan data
karyawan, Anda dapat menggunakan tipe data Struct yang
disediakan oleh Ruby.
49
DAFTAR PUSTAKA
Preiss, Bruno R., Data Structures and Algorithms with ObjectOriented Design Patterns in Ruby, 2004.
50
Tanggal
Kegiatan
19 23 September 2016
2
3
4
5
6
7
8
9
10
12
26 30 September 2016
3 7 Oktober 2016
10 21 Oktober 2016
24 28 Oktober 2016
31 Oktober 4 Nopember 2016
7 11 Nopember 2016
14 18 Nopember 2016
21 25 Nopember 2016
28 Nopember 2 Desember 2016
5 9 Desember 2015
51