diktat struktur data (ok)
DESCRIPTION
Diktat Struktur Data (Ok)TRANSCRIPT
FAKULTAS ILMU KOMPUTER UNIVERSITAS MUHAMMADIYAH RIAU
STRUKTUR DATA DIKTAT KULIAH
2013
i
KATA PENGANTAR
Buku diktat kuliah ini merupakan salah satu bahan ajar pendukung
untuk mata kuliah Struktur Data. Dari buku ini diharapkan mahasiswa dapat
dengan mudah mempelajari, dan memahami materi – materi yang diajarkan
pada kelas. Kemudian buku ini diharapkan dapat menjadi referensi materi
perkuliahan dan pelaksanaan praktikum. Sebagian besar isi dari buku ini
merupakan rangkuman dari sumber-sumber yang telah dibuat penulis lain.
Penulis berharap agar buku ini dapat bermanfaat bagi semua kalangan
pembaca.
Terima kasih unt uk semuanya yang telah memberikan banyak kritik
dan saran serta dukungan dalam penulisan buku ini.
Pekanbaru, Februari 2013
Tim FASILKOM
ii
DAFTAR ISI
KATA PENGANTAR ................................................................................................... i
DAFTAR ISI................................................................................................................. ii
ARRAY.......................................................................................................................... 1
STRUCTURE ................................................................................................................ 8
POINTER ..................................................................................................................... 11
FUNSI dan PROSEDUR ............................................................................................. 13
LINKED LIST ............................................................................................................. 19
STACK ........................................................................................................................ 49
QUEUE ........................................................................................................................ 58
TREE............................................................................................................................ 63
DAFTAR PUSTAKA
1
ARRAY
Array adalah suatu struktur yang terdiri dari sejumlah elemen yang memiliki
tipe data yang sama. Elemen-elemen array tersusun secara sekuensial dalam
memori komputer. Array dapat berupa satu dimensi, dua dimensi, tiga dimensi
ataupun banyak dimensi (multi dimensi).
1.1. Array Satu Dimensi
Array Satu dimensi tidak lain adalah kumpulan elemen-elemen identik yang
tersusun dalam satu baris. Elemen-elemen tersebut memiliki tipe data yang
sama, tetapi isi dari elemen tersebut boleh berbeda.
Elemen ke- 0 1 2 3 4 5 6 7 8 9
Nilai 23 34 32 12 25 14 23 12 11 10
Bentuk umum:
<tipe data> NamaArray[n] = {elemen0, elemen1, elemen2,.....,n};
n = jumlah elemen
Contoh Program:
1.
2
Output:
2.
3
Output:
Atau
4
2.2. Array Dua Dimensi
Array dua dimensi sering digambarkan sebagai sebuah matriks, merupakan
perluasan dari array satu dimensi. Jika array satu dimensi hanya terdiri dari
sebuah baris dan beberapa kolom elemen, maka array dua dimensi terdiri dari
beberapa baris dan beberapa kolom elemen yang bertipe sama sehingga dapat
digambarkan sebagai berikut:
Bentuk umum:
<tipe data> NamaArray [m][n];
Atau
<tipe data> NamaArray [m][n] = { {a,b,..z},{1,2,...,n-1} };
Contoh:
double matrix[4][4];
bool papan[2][2] = { {true,false},{true,false} };
Pendeklarasian array dua dimensi hampir sama dengan pendeklarasian array
satu dimensi, kecuali bahwa array dua dimensi terdapat dua jumlah elemen
yang terdapat di dalam kurung siku dan keduanya boleh tidak sama.
Elemen array dua dimensi diakses dengan menuliskan kedua indeks elemennya
dalam kurung siku seperti pada contoh berikut:
//papan nama memiliki 2 baris dan 5 kolom
bool papan[2][5];
papan[0][0] = true;
papan[0][4] = false;
0 1 2 3 4 5 6
0 10 21 23 43 45 78 65
1 45 43 65 12 21 12 21
2 32 34 23 56 54 34 45
3 11 12 32 23 56 76 45
5
papan[1][2] = true;
papan[1][4] = false;
Contoh program:
6
Output:
7
8
STRUCTURE
Structure (struktur) adalah kumpulan elemen-elemen data yang digabungkan
menjadi satu kesatuan. Masing-masing elemen data tersebut dikenal dengan
sebutan field. Field data tersebut dapat memiliki tipe data yang sama ataupun
berbeda. Walaupun fieldfield tersebut berada dalam satu kesatuan, masing-
masing field tersebut tetap dapat diakses secara individual.
Field-field tersebut digabungkan menjadi satu dengan tujuan untuk kemudahan
dalam operasinya. Misalnya Anda ingin mencatat data-data mahasiswa dan
pelajar dalam sebuah program, Untuk membedakannya Anda dapat membuat
sebuah record mahasiswa yang terdiri dari field nim, nama, alamat dan ipk serta
sebuah record pelajar yang terdiri dari field-field nama, nonurut, alamat dan
jumnilai. Dengan demikian akan lebih mudah untuk membedakan keduanya.
Bentuk umum:
Contoh:
9
Untuk menggunakan struktur, tulis nama struktur beserta dengan fieldnya yang
dipisahkan dengan tanda titik (“ . “). Misalnya Anda ingin menulis nim seorang
mahasiswa ke layar maka penulisan yang benar adalah sebagai berikut:
Jika Pmhs adalah pointer bertipe mahasiswa* maka field dari Pmhs dapat diakses
dengan mengganti tanda titik dengan tanda panah (“ “).
Contoh program:
1.
10
Output:
Latihan:
1. Buat program menghitung durasi rental warnet, dengan ketentuan
perhitungannya:
30 detik = Rp. 130,-
Satuan waktu : jam : menit : detik
2. Buat program menghitung jumlah nilai akhir mahasiswa dengan
ketentuan:
Nilai akhir = 10%*tugas + 20%*kuis + 30%*mid + 40%*uas
Nilai Huruf:
Nilai akhir >85 : A
85 >= nilai akhir > 70 : B
70 >= nilai akhir > 55 : C
55 >= nilai akhir > 40 : D
Nilai akhir <=40 : E
11
POINTER
Pointer merupakan tipe data berukuran 32 bit yang berisi satu nilai yang
berpadanan dengan alamat memori tertentu. Sebagai contoh, sebuah variabel P
bertipe pointer bernilai 0x0041FF2A, berarti P menunjuk pada alamat memori
0041FF2A. Pointer dideklarasikan seperti variabel biasa dengan menambahkan
tanda * (asterik) yang mengawali nama variabel.
Operator Pointer
Suatu pointer dapat berisi alamat dari suatu variable lain untuk dapat
mengakses nilai yang ada di dalam variable berpointer secara lansung dapat
dilakukan dengan menggunakan operator , yaitu:
a. Operator Dereference ( & )
Merupakan operator untuk mengetahui alamat suatu variable di dalam
memori.
b. Operator Reference ( * )
Merupakan operator yang digunakan untuk mengakses secara langsung nilai
yang terdapat di dalam alamat yang merupakan nilai dari variable pointer.
Bentuk Umum:
<tipe data> namaVariabel;
Contoh:
float * px;
Statement di atas mendeklarasikan variabel px yang merupakan pointer.
Penyebutan tipe data float berarti bahwa alamat memori yang ditunjuk oleh px
dimaksudkan untuk berisi data bertipe float.
12
Contoh Program:
1.
Output:
2.
Output:
13
FUNSI dan PROSEDUR
Fungsi adalah sejumlah instruksi yang dikelompokkan menjadi satu,
berdiri sendiri, yang berfungsi untuk menyelesaikan suatu pekerjaan.
Bahasa C minimal mempunyai satu buah fungsi yang disebut Fungsi
main() yaitu fungsi induk/utama. Sintaks penulisannya adalah sebagai
berikut :
TipeData NamaFungsi()
{
Statement
return variabel
}
Contoh fungsi yang memiliki nilai keluaran:
int maksimum(int a, int b)
{
if( a > b )
return (a);
else
return (b);
}
Prosedur adalah suatu fungsi yang tidak mengembalikan nilai, karena itu
tipe data untuk prosedur adalah void atau kosong. Sintaks penulisannya
adalah sebagai berikut :
14
void NamaProsedur()
{
Statement
}
Contoh fungsi yang memiliki nilai keluaran:
void tukar(int a, int b)
{
int c;
c = a;
a = b;
b = c;
}
Sebelum fungsi digunakan atau dipanggil, suatu fungsi harus
dideklarasikan dan didefinisikan terlebih dahulu. Pengertian deklarasi
fungsi berbeda dengan definisi fungsi. Deklarasi fungsi adalah judul
fungsi yang sederhana yang diakhiri dengan tanda semicolon (;) atau
sering disebut dengan prototype fungsi. Sedangkan definisi fungsi adalah
fungsi yang lengkap, terdiri dari judul dan isinya.
Deklarasi fungsi layaknya deklarasi variable, memberitahukan compiler
semua informasi yang dibutuhkan untuk mengompilasi file. Compiler
tidak perlu mengetahui bagaimana fungsi bekerja, yang perlu diketahui
adalah nama fungsi, banyak dan tipe parameternya, dan tipe balikannya
(return). Hal ini merupakan informasi yang dimuat secara lengkap dalam
judul fungsi.
15
Hal – hal yang perlu diperhatikan dalam penggunaan fungsi:
1. Apabila tipe fungsi tidak disebutkan, maka akan dianggap sebagai
fungsi dengan nilai keluaran bertipe integer.
2. Fungsi yang memiliki keluaran bertipe bukan integer, maka
diperlukan penndefinisian penentu tipe fungsi.
3. Fungsi yang tidak memiliki nilai keluar, maka dimasukkan ke dalam
tipe void.
4. Pernyataan yang diberikan untuk memberikan nilai akhir fungsi
berupa penyataan return.
5. Fungsi yang mempunyai parameter, maka banyaknya parameter
harus sama, parameter actual yang berseuaian dengan parameter
formal harus memiliki tipe data yang sama dan nama parameter tidak
harus sama.
16
Penggunaan Parameter
Ada 2 jenis Parameter
• Formal Parameter, merupakan parameter yang muncul di definisi
fungsi atau prosedur.
• Actual Parameter, merupakan parameter yang muncul di program
saat pemanggilan fungsi atau prosedur.
Berikut adalah sintaks untuk penggunaan parameter
Cara melewatkan parameter dari actual ke formal dapat dilakukan
dengan dua cara, yaitu:
1. Pemanggilan secara nilai (Call by Value)
Call by value akan menyalin nilai dari parameter actual ke parameter
formal. Nilai yang dikirimkan ke fungsi adalah nilai dari datanya,
bukan alamat memori letak datanya. Fungsi yang menerima kiriman
nilai akan menimpanya di alamat terpisah dari nilai aslinya yang
digunakan oleh bagian program yang memanggil fungsi. Perubahan
nilai di fungsi (parameter formal) tidak akan mengubah nilai asli di
bagian program yang memanggilnya. Pengiriman parameter secara
nilai adalah pengiriman searah, yaitu dari bagian program yang
main()
{
……
…….
…….
……
X = Jumlah(a,b);
float Jumlah (int x, int y)
{
return ( a + b );
}
Parameter
aktual
Parameter
formal
17
memanggil fungsi ke fungsi yang dipanggil. Pengiriman suatu nilai
dapat dilakukan untuk suatu ungkapan, tidak hanya untuk sebuah
variable, elemen array atau konstanta.
2. Pemanggilan secara referensi (Call by Reference)
Kebalikan dari call by value, call by reference tidak mengirimkan nilai
dari data yang dikirim, akan tetapi yang dikirim adalah alamat
memori dari nilai data pada parameter actual. Fungsi yang menerima
kiriman alamat ini akan menggunakan alamat yang sama untuk
mendapatkan nilai datanya. Hal ini dapat dilakukan dimana
parameter formal diawali dengan operator alamat (&). Perubahan
nilai pada fungsi akan mengubah nilai asli di bagian program yang
memanggil fungsi. Pengiriman ini bersifat dua arah atau komunikasi
dua arah, yaitu dari fungsi pemanggil ke fungsi yang dipanggil dan
juga sebaliknya.
Pernyataan Return
Pernyataan return() digunakan untuk mengirimkan nilai dari suatu fungsi
kepada fungsi lain yang memanggilnya. Penyataan return() diikuti oleh
argument yang berupa nilai yang akan dikirimkan. Pernyataan return() dapat
diletakkan pada baris mana saja. Begitu pernyataan return() dieksekusi maka
eksekusi terhadap fungsi juga berakhir.
18
Fungsi Rekursif
Merupakan fungsi yang memanggil dirinya sendiri. Pada beberapa persoalan,
fungsi rekursif sangat berguna karena mempermudah soluai. Namun, fungsi
rekursif juga memiliki kelemahan, yakni memungkinkan terjadinya overlow
pada stack, yang berarti stack tidak lagi mampu menangani permintaan
pemanggilan fungsi karena kehabisan memori (stack adalah area memoriyang
dipakai untu variable local untuk mengalokasikan memori ketika suatu fungsi
dipanggil. Oleh sebab itu harus ada jaminan bahwa proses rekursif akan
berhenti pada suatu waktu tertentu, yang menyebabkan pemanggilan fungsi
berhenti.
Fungsi Overloading
Mendefinisikan beberapa fungsi yang memiliki nama yang sama tetapi
parameter yang berbeda. Compiler C akan memanggil fungsi yang berdasarkan
tipe data argumennya atau banyaknya argument dan tipe data argument pada
pemanggilan fungsinya.
19
LINKED LIST
Pada bab sebelumnya telah dijelaskan mengenai variabel array yang bersifat
statis (ukuran dan urutannya sudah pasti). Selain itu, ruang memori yang
dipakai olehnya tidak dapat dihapus bila array tersebut sudah tidak digunakan
lagi pada saat program dijalankan. Untuk memecahkan masalah di atas, kita
dapat menggunakan variabel pointer. Tipe data pointer bersifat dinamis,
variabel akan dialokasikan hanya pada saat dibutuhkan dan sesudah tidak
dibutuhkan dapat direlokasikan kembali.
Single Linked List
Apabila setiap Anda ingin menambahkan data, Anda selalu menggunakan
variabel pointer yang baru, Anda akan membutuhkan banyak sekali pointer.
Oleh karena itu, ada baiknya jika Anda hanya menggunakan satu variabel
pointer saja untuk menyimpan banyak data dengan metode yang kita sebut
Linked List. Jika diterjemahkan, ini berarti satu daftar isi yang saling
berhubungan. Untuk lebih jelasnya, perhatikan gambar di bawah ini:
Pada gambar di atas tampak bahwa sebuah data terletak pada sebuah lokasi
memori area. Tempat yang disediakan pada satu area memori tertentu untuk
menyimpan data dikenal dengan sebutan node/simpul. Setiap node memiliki
pointer yang menunjuk ke simpul berikutnya sehingga terbentuk satu untaian,
degan demikian hanya diperlukan sebuah variabel pointer. Susunan berupa
untaian semacam ini disebut Single Linked List (NULL memilik nilai khusus
A B C NULL
20
yang artinya tidak menunjuk ke mana-mana. Biasanya Linked List pada titik
akhirnya akan menunjuk ke NULL).
A. Single Linked List Non Cingular
Operasi Pada Single Linked List
1. Deklarasi dan pembuatan
Penjelasan:
Pembuatan struct bernama tnode yang berisi 2 field, yaitu field data bertipe
integer dan field next yang bertipe pointer dari tnode. Setelah pembuatan
struct, buat variabel head yang betipe pointer dari tnode yang berguna
sebagai kepala linked list.
Pembuatan Single Linked List Non Cingular
Digunakan keyword new yang berarti membuat sebuah node baru beserta
alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya
ditunjuk ke NULL.
Single Linked List Non Cingular menggunakan Head
Dibutuhkan satu buah variabel pointer : head. Head akan selalu menunjuk
pada node pertama Deklarasi Pointer Penunjuk Kepala Single Linked List.
Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju,
melainkan harus menggunakan suatu pointer penunjuk ke node pertama
dalam linked list ( dalam hal ini adlah head ). Deklarasi sebagai berikut:
21
Fungsi inisialisasi single linked list
Fungsi untuk mengetahui kosong tidaknya single linked list jika pointer
head tidak menunjuk pada suatu node maka head kosong.
2. Menampilkan isi List
Fungsi di bawah digunakan untuk menampilkan semua isi list, di mana
linked list ditelusuri satu-persatu dari awal node sampai akhir node.
Penelusuran ini dilakukan dengan menggunakan suatu pointer bantu,
karena pada prinsipnya pointer head yang menjadi tanda awal list tidak
boleh berubah/berganti posisi.
Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk
ke nilai NULL. Jika tidak NULL, maka node bantu akan berpindah ke
node selanjutnya dan membaca isi datanya dengan menggunakan field
next sehingga dapat saling berkait. C. Jika head masih NULL berarti data
masih kosong.
22
Ilustrasi:
3. Menambah isi Linked List
a. Penambahan dari depan
Penambahan node baru akan dikaitkan di node paling depan, namun
pada saat pertama kali (data masih kosong), maka penambahan data
dilakukan dengan cara: node head ditunjukkan ke node baru tersebut.
Pada prinsipnya adalah mengkaitkan node baru dengan head,
kemudian head akan menunjuk pada data baru tersebut sehingga head
akan tetap selalu menjadi data terdepan.
23
b. Penambahan dari belakang
Penambahan data dilakukan di belakang, namun pada saat pertama
kali, node langsung ditunjuk oleh head. Penambahan di belakang lebih
sulit karena kita membutuhkan pointer bantu untuk mengetahui node
terbelakang, kemudian setelah itu, dikaitkan dengan node baru. Untuk
mengetahui data terbelakang perlu digunakan perulangan.
24
4. Menghapus isi Linked List
a. Hapus dari depan
Fungsi di bawah akan menghapus data teratas (pertama) yang ditunjuk
oleh head pada linked list. Penghapusan node tidak boleh dilakukan
jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan
penggunakan suatu pointer lain yang digunakan untuk menunjuk
node yang akan dihapus, misalnya pointer hapus dan barulah
kemudian menghapus pointer hapus dengan menggunakan perintah
delete.
Sebelum data terdepan dihapus, head harus ditunjukkan ke node
sesudahnya terlebih dahulu agar list tidak putus, sehingga node setelah
head lama akan menjadi head baru (data terdepan yang baru). Jika
head masih NULL maka berarti data masih kosong.
25
Ilustrasi:
b. Hapus dari belakang
Membutuhkan pointer bantu dan hapus. Pointer hapus digunakan
untuk menunjuk node yang akan dihapus, dan pointer bantu
digunakan untuk menunjuk node sebelum node yang dihapus yang
kemudian selanjutnya akan menjadi node terakhir. Pointer bantu akan
digunakan untuk menunjuk ke nilai NULL. Pointer bantu akan selalu
bergerak sampai sebelum node yang akan dihapus, baru kemudian
pointer hapus diletakkan setelah pointer bantu. Setelah itu pointer
hapus akan dihapus, pointer bantu akan menunjuk ke NULL.
26
Ilustrasi :
27
B. Single Linked List Cingular
SLLC adalah Single Linked List yang pointer nextnya menunjuk pada
dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node,
maka pointer next pada node terakhir akan menunjuk ke node terdepannya.
Setiap node pada linked list mempunyai field yang berisi pointer ke node
berikutnya, dan juga memiliki field yang berisi data.
Pada akhir linked list, node terakhir akan menunjuk ke node terdepan
sehingga linked list tersebut berputar.
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
};
Pembentukan node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
Operasi pada CSLL dengan HEAD dan TAIL
1. Deklarasi dan pembuatan
28
Dibutuhkan dua buah variabel pointer: head dan tail. Head akan selalu
menunjuk pada node pertama, sedangkan tail akan selalu menunjuk
pada node terakhir.
Inisialisasi SLLC
TNode *head, *tail;
Fungsi Inisialisasi SLLC
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya SLLC
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
29
2. Penambahan
a. Tambah depan
Ilustrasi:
b. Tambah belakang
30
31
3. Penghapusan
a. Hapus depan
Ilustrasi:
Function di atas akan menghapus data terdepan (pertama) yang
ditunjuk oleh head pada linked list. Penghapusan node tidak boleh
dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka
harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus
pada head, kemudian dilakukan pergeseran head ke node berikutnya
sehingga data setelah head menjadi head baru, kemudian
32
menghapus variabel hapus dengan menggunakan perintah delete.
Jika tail masih NULL maka berarti data masih kosong!
b. Hapus belakang
33
Function di atas akan menghapus data terbelakang (terakhir) yang
ditunjuk oleh tail pada linked list. Penghapusan node tidak boleh
dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka
harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus
pada tail, kemudian dibutuhkan pointer bantu untuk membantu
pergeseran dari head ke node berikutnya sampai sebelum tail,
sehingga tail dapat ditunjukkan ke bantu tersebut, dan bantu tersebut
akan menjadi tail yang baru. Setelah itu hapus variabel hapus dengan
menggunakan perintah delete. Jika tail masih NULL maka berarti
data masih kosong!
Double Linked List
Salah satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat
bergerak satu arah saja, maju/ mundur, atau kanan/kiri sehingga pencarian data
pada single linked list hanya dapat bergerak dalam satu arah saja. Untuk
mengatasi kelemahan tersebut, anda dapat menggunakan metode double linked
list. Linked list ini dikenal dengan nama Linked list berpointer Ganda atau
Double Linked List.
A. Double linked list non cingular
34
DLLNC adalah Double Linked List yang memiliki 2 buah pointer yaitu
pointer next dan prev. Pointer next menunjuk pada node setelahnya dan
pointer prev menunjuk pada node sebelumnya. Double artinya field
pointer-pointernya dua buah dan dua arah, ke node/data sebelum dan
sesudahnya. Linked list artinya node-node tersebut saling terhubung sama
lain. Non cingular artinya pointer prev dan nextnya akan menunjuk pada
NULL.
Ilustrasi DLLNC
1) Setiap node pada linked list mempunyai field yang berisi data dan
pointer ke node berikutnya dan ke node sebelumnya.
2) Untuk pembentukan node baru, mulanya pointer next dan prev akan
menunjuk ke nilai NULL.
3) Selanjutnya pointer prev akan menunjuk ke node sebelumnya, dan
pointer next akan menunjuk ke node selanjutnya pada list.
DLLNC dengan head
Dibutuhkan satu buah variabel pointer : head. Head akan selalu menunjuk
node/ simpul pertama.
35
Deklarasi pointer penunjuk kepala double linked list manipulasi linked list
tidak bisa dilakukan langsung ke node yang dituju, melainkan harus melalui
node pertama dalam linked list.
Fungsi inisialisasi double linked list non cingular:
Fungsi untuk mengetahui kosong tidaknya DLLNC
Operasi –operasi pada Double Linked List
1. Menampilkan isi Double List
36
2. Menambah isi Double List
a. Tambah dari depan
Penambahan node baru akan dikaitkan di node paling depan, namun
pada saat pertama kali (data masih kosong), maka penambahaan data
dilakukan pada headnya.
Pada prinsipnya adalah mengkaitkan data baru dengan head,
kemudian head akan menunjuk pada data baru tersebut sehingga head
akan tetap selalu menjadi data terdepan. Untuk menghubungkan node
terakhir dengan node terdepan dibutuhkan pointer bantu.
37
Ilustrasi :
38
b. Tambah dari belakang
Penambahan data dilakukan di belakang, namun pada saat pertama
kali data langsung ditunjuk headnya.
Penambahan di belakang lebih sulit karena kita membutuhkan pointer
bantu untuk mengetahui data terbelakang, kemudian dikaitkan
dengan data baru. Untuk mengetahui data terbelakang perlu
digunakan perulangan.
39
Ilustrasi:
40
3. Menghapus isi Double List
a. Hapus dari depan
Penghapusan dilakukan pada node paling depan, yaitu node yang
ditunjuk oleh head. Terjadi pergeseran head ke belakang atau head
akan menunjuk ke elemen/ node berikutnnya.
Ilustrasi:
41
b. Hapus dari belakang
Ilustrasi:
Tidak diperlukan pointer bantu yang mengikuti pointer hapus yang
berguna untuk menunjuk ke NULL. Karena pointer hapus sudah bisa
menunjuk ke pointer sebelumnya, yang menggunakan elemen prev ke
42
node/data sebelumnya, yang akan diset agar menunjuk ke NULL
setelah penghapusan dilakukan.
B. Circular Double Linked List
Double Linked List Circular adalah linked list dengan menggunakan
pointer, dimana setiap node memiliki 3 field, yaitu 1 field pointer yang
menunjuk pointer berikutnya (next), 1 field menunjuk pointer sebelumnya
(prev), serta sebuah field yang berisi data untuk node tersebut. Double
Linked List Circular pointer next dan prev nya menunjuk ke dirinya sendiri
secara circular.
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
Tnode *prev;
};
Pembentukan node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
43
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
Operasi pada CDLL
1. Deklarasi dan pembuatan
Dibutuhkan dua buah variabel pointer: head dan tail. Head akan selalu
menunjuk pada node pertama, sedangkan tail akan selalu menunjuk
pada node terakhir.
Inisialisasi DLLNC
TNode *head, *tail;
Fungsi Inisialisasi DLLNC
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya DLLNC
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
2. Penambahan
a. Tambah depan
44
45
b. Tambah belakang
Penambahan node di belakang akan selalu dikaitkan dengan tail dan
kemudian node baru tersebut akan menjadi tail
46
3. Penghapusan
a. Hapus depan
Ilustrasi:
47
b. Hapus belakang
Pointer hapus tidak perlu di loop untuk mencari node terakhir.
Pointer hapus hanya perlu menunjuk pada pointer tail saja.
Karena pointer hapus sudah bisa menunjuk ke pointer sebelumnya
dengan menggunakan elemen prev ke node sebelumnya. Kemudian
pointer tail akan berpindah ke node sebelumnya.
Ilustrasi:
48
49
STACK
Definisi Stack
Stack adalah suatu tumpukan dari benda. Konsep utamanya adalah LIFO (Last In
First Out), benda yang terakhir masuk dalam stack akan menjadi benda pertama
yang
Pada gambar diatas, jika kita ingin mengambil sesuatu dari tumpukan maka kita
harus mengambil benda paling atas dahulu, yakni compo. Misalnya jika VCD
langsung diambil, compo akan jatuh. Prinsip stack ini bias diterapkan dalam
pemrograman. Di C++, ada dua cara penerapan prinsip stack, yakni dengan
array dan linked list.
Setidaknya stack haruslah memiliki operasi-operasi sebagai berikut.
Push Untuk menambahkan item pada tumpukan paling atas
Pop Untuk mengambil item teratas
Clear Untuk mengosongkan stack
IsEmpty Untuk memeriksa apakah stack kosong
IsFull Untuk memeriksa apakah stack sudah penuh
50
Dalam bab ini penjelasan mengenai stack akan menggunakan kelas stack. Kelima
operasi stack diatas akan dideklarasikan secara abstrak dalam kelas ini,
sedangkan kelas turunan dari stack akan mengimplementasikan operasi-operasi
tersebut.
Stack dengan Array
Sesuai dengan sifat stack, pengambilan / penghapusan delemen dalam stack harus
dimulai dari elemen teratas.
Operasi-operasi pada Stcak dengan Array
1. Konstruktor
Fungsi ini membuat sebuah stack baru yang masih kosong. Konsepnya adalah
bahwa Top menunjukkan elemen stack teratas. Jika Top bernilai -1, berarti
tumpukan kosong.
2. IsFul
Fungsi ini memeriksa apakah stack yang ada sudah penuh. Stack penuh jika
stack penuh jika puncak stack terdapat tepat dibawah jumlah maksimum yang
dapat ditampung stack atau dengan kata lain Top = MAX_STACK -1.
3. Push
Fungsi ini menambahkan sebuah elemen ke dalam stack dan tidak bias
dilakukan lagi jika stack sudah penuh.
4. IsEmpty
Fungsi menentukan apakah stack kosong atau tidak. Tanda bahwa stack kosong
adalah Top bernilai kurang dari nol.
5. Pop
Fungsi ini mengambil elemen teratas dari stack dengan syarat stack tidak boleh
kosong.
6. Clear
Fungsi ini mengosongkan stack dengan cara mengeset Top dengan -1. Jika Top
bernilai kurang dari nol maka stack dianggap kosong.
51
Contoh Stack dengan Array
#include <iostream.h>
#include <conio.h>
#define MaxS 10
struct Stack
{
X char Isi[MaxS];
C unsigned int Top;
};
void INITS (Stack &S);
N void PUSH(Stack &S, char Data);
void CETAK(Stack S);
void POP(Stack &S, char &Hsl);
main()
{
char huruf;
Stack S;
INITS(S);
cout<<”Masukkan Karakter :”;
cin>>huruf;
PUSH(S,huruf);
CETAK(S);
POP(S,huruf);
cout<<endl<<”Yang Dihapus...”<<huruf;
CETAK(S);
cout<<endl<<”Masukkan Karakter :”;
cin>>huruf;
PUSH(S,huruf);
CETAK(S);
POP(S,huruf);
cout<<endl<<”Yang Dihapus...”<<huruf;
CETAK(S);
getch();
}
void INITS(Stack &S)
{
S.Top = 0;
}
void PUSH(Stack &S, char Data)
{
if (S.Top < MaxS)
{
S.Top++;
S.Isi[S.Top] = Data;
}
else
cout<<”Stack Penuh........”;
}
void CETAK(Stack S)
{
int i;
cout<<endl<<”Isi Stack : “;
52
if (S.Top != 0)
{
for(i=1; i<=S.Top; i++)
{
cout<<S.Isi[i];
}
}
else
cout<<”Stack Kosong.....”;
}
void POP(Stack &S, char &Hsl)
{
if(S.Top != 0)
{
Hsl = S.Isi[S.Top];
S.Top--;
}
else
cout<<”Stack Kosong.....”;
}
Pertanyaan:
Perkirakan output yang dihasilkan oleh contoh program stack di atas!
53
Double Stack dengan Array
Metode ini adalah teknik khusus yang dikembangkan untuk menghemat
pemakaian memori dalam pembuatan dua stack dengan array. Intinya adalah
penggunaan hanya sebuah array untuk menampung dua stack.
Tampak jelas bahwa sebuah array dapat dibagi untuk dua stack, stack 1 bergerak
ke atas dan stack 2 bergerak ke bawah. Jika Top1 (elemen teratas dari Stack 1)
bertemu dengan Top 2 (elemen teratas dari Stack 2) maka double stack telah
penuh.
Implementasi double stack dengan array adalah dengan memanfaatkan operasi-
operasi yang tidak berbeda jauh dengan operasi single stack dengan array.
Operasi-operasi Double Stack Array
1. Konstruktor
Fungsi ini membuat stack baru yang masih kosong. Top[0] diset dengan -1 dan
Top[1] diset dengan MAX_STACK.
2. IsFull
Fungsi ini memeriksa apakah double stack sudah penuh. Stack dianggap penuh
jika Top[0] dan Top[1] bersentuhan sehingga stack tida memiliki ruang kosong.
Dengan kata lain, (Top[0] + 1) > Top[1].
3. Push
Fungsi ini memasukkan sebuah elemen ke salah satu stack.
4. IsEmpty
Fungsi memeriksa apakah stack pertama atau stack kedua kosong. Stack
pertama dianggap kosong jika puncak stack bernilai kurang dari nol,
sedangkan stack kedua dianggap kosong jika puncak stack sama atau melebihi
MAX_STACK.
5. Pop
Fungsi ini mengeluarkan elemen teratas dari salah satu stack
6. Clear
Fungsi ini mengosongkan salah satu stack.
54
Stack dengan Single Linked List
Selain implementasi stack dengan array seperti telah dijelasnkan sebelumnya,
ada cara lain untuk mengimplementasi stack dalam C++, yakni dengan single
linked list. Keunggulannya dibandingkan array tebtu saja adalah penggunaan
alokasi memori yang dinamis sehingga menghindari pemborosan memori.
Misalnya saja pada stack dengan array disediakan tempat untuk stack berisi 150
elemen, sementara ketika dipakai oleh user stack hanya diisi 50 elemen, maka
telah terjadi pemborosan memori untuk sisa 100 elemen, yang tak terpakai.
Dengan penggunaan linked list maka tempat yang disediakan akan sesuai
dengan banyaknya elemen yang mengisi stack. Oleh karena itu pula dalam stack
dengan linked list tidak ada istilah full, sebab biasanya program tidak
menentukan jumlah elemen stack yang mungkin ada (kecuali jika sudah dibatasi
oleh pembuatnya). Namun demikian sebenarnya stack ini pun memiliki batas
kapasitas, yakni dibatasi oleh jumlah memori yang tersedia.
Operasi-operasi untuk Stack dengan Linked List
1. Konstruktor
Fungsi ini membuat stack baru yang kosong. Stack adalah kosong jika Top tidak
menunjuk apa pun (bernilai NULL).
2. IsEmpty
Fungsi memeriksa apakah stack yang adamasih kosong.
3. Push
Fungsi memasukkan elemen baru ke dalam stack. Push di sini mirip/
menggunakan fungsi tambah belakang dalam single linked list.
4. Pop
Fungsi ini mengeluarkan elemen teratas dari stack. Pop di sini mirip/
menggunakan fungsi hapus belakang dalam single linked list.
55
5. Clear
Fungsi ini akan menghapus stack yang ada.
Pemanfaatan Stack
Pemanfaatan stack antara lain untuk menulis ungkapan dengan
menggunakan notasi tertentu.
Contoh :
( A + B ) * ( C – D )
Tanda kurung selalu digunakan dalam penulisan ungkapan numeris untuk
mengelompokkan bagian mana yang akan dikerjakan terlebih dahulu.
Dari contoh ( A + B ) akan dikerjakan terlebih dahulu, kemudian baru ( C – D )
dan terakhir hasilnya akan dikalikan.
A + B * C – D
B * C akan dikerjakan terlebih dahulu, hasil yang didapat akan berbeda dengan
hasil notasi dengan tanda kurung.
1. Notasi Prefix
Operator ditulis sebelum kedua operand yang akan disajikan.
Algoritma Infix ke Prefix:
a. Langkah 1
Baca ungkapan dalam notasi infix, misalnya S; Tentukan panjang
ungkapan tersebut, misalnya N; Siapkan sebuah tumpukan kosong dan
siapkan derajat masing – masing operator.
Misalnya : * dan / berderajat 2, + dan – berderajat 1 dan ( berderajat 0 ).
b. Langkah 2
Dimulai dari I : N sampai 1, kerjakan langkah – langkah berikut:
R = S ( I )
Test nilai R . Jika R adalah :
Operand : Langsung ditulis
Kurung buka : Pop dan tulis semua isi tumpukan sampai ujung tumpukan
= ‘)‘, pop juga tanda ini tetapi tidak perlu ditulis .
Kurung tutup : Push kedalam tumpukan
56
Operator : Jika tumpukan kosong, atau derajat R lebih tinggi dibanding
derajat ujung tumpukan, push operator kedalam tumpukan. Jika tidak pop
ujung tumpukan dan tulis, kemudian ulangi perbandingan R dengan
ujung tumpukan, lalu R di push.
c. Langkah 3
Jika akhir notasi infix telah tercapai dan tumpukan masih belum kosong,
pop semua isi tumpukan dan tulis hasilnya.
d. Contoh:
Proses konversi dari infix ke prefix :
= ( A + B ) * ( C – D )
= [ + A B ] * [ - C D ]
= * [ + A B ] [ - C D ]
= * + A B - C D
Contoh notasi prefix dari notasi infix :
• Infix Prefix
A + B + A B
A + B – C - + A B C
( A + B ) * ( C – D ) * + A B – C
D
2. Notasi Postfix
Kebalikan notasi prefix. Lebih dikenal dengan Notasi Polish Terbalik ( Reverse
Polish Notation atau RPN). Dalam hal ini operator ditulis sesudah operand.
Algoritma Infix ke Postfix:
a. Langkah 1
Baca ungkapan dalam notasi infix, misalnya S; Tentukan panjang
ungkapan tersebut, misalnya N; Siapkan sebuah tumpukan kosong dan
siapkan derajat masing – masing operator.
Misalnya : * dan / berderajat 2, + dan – berderajat 1 dan ( berderajat 0 ).
b. Langkah 2
Dimulai dari I : 1 sampai N, kerjakan langkah –langkah berikut:
R = S ( I )
57
Test nilai R . Jika R adalah :
Operand : Langsung ditulis
Kurung buka : Push kedalam tumpukan
Kurung tutup : Pop dan tulis semua isi tumpukan sampai ‘(‘, pop juga
tanda ini tetapi tidak perlu ditulis
Operator : Jika tumpukan kosong, atau derajat R lebih tinggi
dibanding derajat ujung tumpukan, push operator kedalam tumpukan.
Jika tidak pop ujung tumpukan dan tulis, kemudian ulangi perbandingan
R dengan ujung tumpukan, lalu R di push.
c. Langkah 3
Jika akhir notasi infix telah tercapai dan tumpukan masih belum kosong,
pop semua isi tumpukan dan tulis hasilnya.
d. Contoh:
Dari infix ke postfix :
( 6 - 2 ) * ( 5 + 4 ) = [ 6 2 - ] * [ 5 4 + ]
= [ 6 2 - ] [ 5 4 + ] *
= 6 2 - 5 4 + *
58
QUEUE
7.1. Definisi Queue
Jika diartikan secara harafiah, queue berarti antrian, queue merupakan salah
satu contoh aplikasi dari pembuatan double linked list yang cukup sering
kita temui dalam kehiduypan sehari-hari, misalnya saat Anda mengantri di
loket untuk membeli tiket. Istilah yang cukup sering dipakai seseorang
masuk dalam sebuah antrian adalah enqueue. Dalam suatu antrian, yang
dating terlebih dahulu akan dilayani lebih dahulu.
Istilah yang sering dipakai bila seseorang keluar dari antrian adalah dequeue.
Walaupun berbeda implementasi, struktur data queue setidaknya harus
memiliki operasi-operasi sebagai berikut :
EnQueue Memasukkan data ke dalam antrian
DeQueue Mengeluarkan data terdepan dari antrian
Clear Menghapus seluruh antrian
IsEmpty Memeriksa apakah antrian kosong
IsFull Memeriksa apakah antrian penuh
7.2. Implementasi Queue dengan Linear Array
Linear Array
Linear array adalah suatu array yang dibuat seakan-akan merupakan suatu
garis lurus dengan satu pintu masuk dan satu pintu keluar.
Berikut ini diberikan deklarasi kelas Queue Linear sebagai implementasi
dari Queue menggunakan linear array. Dalam prakteknya, anda dapat
menggantinya sesuai dengan kebutuhan Anda. Data diakses dengan field
data, sedangkan indeks item pertama dan terakhir disimpan dalam field
Head dan Tail.
Konstruktor akan menginisialisasikan nilai Head dan Tail dengan -1 untuk
menunjukkan bahwa antrian masih kosong da mengalokasikan data
59
sebanyak MAX_QUEUE yang ditunjuk oleh Data. Destruktor akan
mengosongkan antrian kembali dan mendealokasikan memori yang
digunakan oleh antrian.
Operasi-operasi Queue dengan Linear Array
1. Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong
dengan memberikan nilai awal (head) dan nilai akhir (tail) dengan -1.
Nilai -1 menunjukkan bahwa queue (antrian) masih kosong.
2. IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong
atau sudah berisi data. hal ini dilakukan dengan mengecek apakah tail
bernilai -1 atau tidak. Nilai -1 menandakan bahwa queue masih kosong.
3. IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau
masih bisa menampung data dengan cara mengecek apakah nilai tail
sudah sama dengan jumlah maksimal queue. Jika nilai keduanya sama,
berarti queue sudah penuh.
4. EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen dalam
queue.
5. DeQueue
Fungsi DeQueue berguna untuk mengambil sebuah elemen dari queue.
Operasi ini sering disebut juga serve. Hal ini dilakukan dengan cara
memindahkan sejauh satu langkah ke posisi di depannya sehingga
60
otomatis elemen yang paling depan aka tertimpa dengan elemen yang
terletak di belakangnya.
6. Clear
Fungsi Clear berguna untuk menghapus semua lemen dalam queue
dengan jalan mengeluarkan semua elemen tersebut satu per satu hingga
queue kosong dengan memanfaatkan fungsi DEQueue.
7.3. Implementasi Queue dengan Circular Array
Circular Array
Circular array adalah suatu array yang dibuat seakan-akan merupakan
sebuah lingkaran dengan titik awal (head) dan titik akhir (tail) saling
bersebelahan jika array tersebut masih kosong.
Posisi head dan tail pada gambar diatas adalah bebas asalkan saling
bersebelahan. Berikut ini diberikan deklarasi kelas Queue Circular sebagai
implementasi circular array. Dalam prakteknya, Anda dapat
menggantikanny sesuai dengan kebutuhan Anda. Data diakses dengan field
data, sedangkan indeks itemn pertama dan terakhir disimpan dalam field
Head dan Tail. Konstruktor akan menginisialisasi nilai Head dan Tail
dengan 0 dan MAX-QUEUE-1 untuk menunjukkan bahwa antrian masih
kosong dan mengalokasikan data sebanyak MAX-QUEUE yang ditunjuk
oleh Data. destruktor akan mengosongkan antrian kembali dan
mendealokasikan memori yang digunakan oleh antrian.
61
Operasi-operasi Queue dengan Circular Array
1. Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong,
yaitu denga cara memberikan nilai awal (head) dengan nol (0) dan nilai
akhir (tail) dengan jumlah maksimal data yang akan di tampung/array.
2. IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah Queue masih kosong
atau sudah berisi. Hal ini dilakukan dengan mengecek apakah tail masih
terletak bersebelahan dengan head dan tail lebih besar dari head atau
tidak. Jika benar, maka queue masih kosong.
3. IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau
masih bias menampung data dengan cara mengecek apakah tempat
yang masih kosong tinggal satu atau tidak (untuk membedakan dengan
empty dimana semua tempat kosong). Jika benar berarti queue penuh.
4. EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke dalam
queue tail dan head mula-mula bernilai nol (0).
5. DeQueue
DeQueue berguna untuk mengambil sebuah elemen dari queue. Hal ini
dilakukan dengan cara memindahkan posisi head satu langkah ke
belakang.
62
7.4. Implementasi Queue dengan Double Linked List
Selain menggunakan array, queue juga dapat dibuat dengan linked list.
Metode linked list yang digunakan adalah double linked list.
Operasi-operasi Queue dengan Double Linked List
1. Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong,
yaitu dengan mengarahkan pointer head dan tail kepada NULL.
2. IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong
atau sudah berisi data. Hal ini dilakukan dengan mengecek apakah head
masih menunjukkan pada Null atau tidak. Jika benar berarti queue
masih kosong.
3. IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau
masih bias menampung data dengan cara mengecek apakah Jumlah
Queue sudah sama dengan MAX_QUEUE atau belum. Jika benar maka
queue sudah penuh.
4. EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke dalam
queue (head dan tail mula-mula meunjukkan ke NULL).
5. DeQueue
Procedure DeQueue berguna untuk mengambil sebuah elemen dari
queue. Hal ini dilakukan dengan cara menghapus satu simpul yang
terletak paling depan (head).
63
TREE
8.1. Definisi Tree
Tree merupakan salah satu bentuk struktur data tidak linear yang
menggambarkan hubungan yang bersifat hierarkis (hubungan one to many)
antara elemen-elemen. Tree bias didefinisikan sebagai kumpulan
simpul/node dengan elemen khusus yang disebut Root. Notde lainnya
terbagi menjadi himpunan-himpunan yang saling tak berhubungan satu
sama lain (disebut Subtree). Untuk lebih jelasnya, di bawah akan diuraikan
istilahistilah umum dalam tree.
Predecessor Node yang berada di atas node tertentu
Successor Node yang berada dibawah node tertentu
Ancestor Seluruh node yang terletak sebelum node tertentu
dan terletak pada jalur yang sama
Descendant Seluruh node yang terletak sebelum node tertentu
dan terletak pada jalur yang sama
Parent Predecessor satu level di atas suatu node
Child Successor satu level di bawah suatu node
Sibling Node-node yang memiliki parent yang sama
dengan suatu node
Subtree Bagian dari tree yang berupa suatu node beserta
descendantnya dan memiliki semua karakteristik
dari tree tersebut.
Size Banyaknya node dalam suatu tree
Height Banyaknya tingkatan / level dalam suatu tree
Root Satu-satunya node khusus dalam tree yang tak
punyak predecessor
Leaf Node-node dalam tree yang tak memiliki
successor
Degree Banyaknya child yang dimiliki suatu node
64
8.2. Jenis-jenis Tree
Binary Tree
Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh
memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah.
Sesuai dengan definisi tersebut tiap node dalam binary tree hanya boleh
memiliki paling banyak dua child.
Tree yang akan dibuat adalah :
HAKCBLJ
• H dijadikan sebagai root
• A < H : A menjadi subtree kiri H
• K > H : K menjadi subtree
kanan H
• C < H ---> C > A : C menjadi
subtree kanan dari A.
• B < H ---> B > A --->B < C
: B menjadi subtree kiri dari C.
• L > H---> L > K : L menjadi
subtree kanan dari K.
• J < H --->J < K : J menjadi
subtree kiri dari K.
Representasi Tree
Tree dapat direpresentasikan dalam beberpa bentuk, yaitu: diagram venn,
notasi tingkat dan notasi kurung. Untuk lebih jelasnya lagi dapat dilihat
contoh berikut:
65
Gambar Diagram Pohon
Gambar Diagram Venn
66
Notasi Tingkat
Notasi Kurung = (A(B(D,E(I,J)),C(F,G,H)))
Jenis- Jenis Binary Tree :
1. Full Binary Tree
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap
subtree harus mempunyai panjang path yang sama.
2. Complete Binary Tree
Jenis ini mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki
panjang path yang berbeda dan setiap node kecuali leaf hanya boleh
memiliki 2 child.
3. Skewed Binary Tree
Skewed Binary Tree adalah Binary Tree yang semua nodenya (kecuali leaf)
hanya memiliki satu child.
4. Implementasi Binary Tree
Binary tree dapat diimplementasikan dalam C++ dengan menggunakan
double linkedlist.
67
8.3. Operasi-operasi pada Binary Tree
Create Membentuk binary tree baru yang masih kosong
Clear Mengosongkan binary tree yang sudah ada
Empty Function untuk memeriksa apakah binary tree masih
kosong
Insert Memasukkan sebuah node ke dalam tree. Ada tiga
pilihan insert : sebagai root, left child, atau right child.
Khusus insert sebagai root, tree harus dalam keadaan
kosong
Find Mencari root, parent, left child, atau right child dari
suatu node. (tree tidak boleh kosong).
Update Mengubah isi dari node yang ditunjuk oleh pointer
curret
(Tree tidak boleh kosong)
Retrieve Mengetahui isi dari node yang ditunjuk oleh pointer
current
(Tree tidak boleh kosong)
DeleteSub Menghapus sebuah subtree (node beserta seluruh
descendantnya) yang ditunjuk current. Tree tidak
boleh kosong. Setelah itu, pointer current dakan
berpindah ke parent dari node yang dihapus.
Characteristic Mengetahui karakteristik dari suatu tree, yakni: size,
height, serta average length. Tree tidak boleh kosong.
Traverse Mengunjungi seluruh node-node pada tree, masing-
masing sekali. Hasilnya adalah urutan informasi
secara linear yang tersimpan dalam tree. Ada tiga cara
traverse,yaitu PreOrder, InOrder, dan PostOrder.
Langkah-langkah Tranverse :
• PreOrder : cetak isi node yang dikunjungi, kunjungi Left Child, kunjungi
Right Child
68
• InOrder : kunjungi Left Child, cetak isi node yang dikunjungi, kunjungi
Right Child
• PostOrder : kunjungi Left Child, kunjungi Right Child cetak isi node yang
dikunjungi.
8.4. Binary Search Tree
Binary Tree ini memiliki sifat dimana semua left child harus lebih kecil dari
pada right child dan parentnya. Semua right child juga harus lebih besar dari
left child serta parentnya. Binary search tree dibuat untuk mengatasi
kelemahan pada binary tree biasa, yaitu kesulitan dalam searching /
pendarian node tertentu dalam binary tree.
Pada dasarnya operasi dalam Binary Search Tree sama dengan Binary Tree
biasa, kecuali pada operasi insert, update, dan delete.
1. Insert
Pada Binary Search Tree insert dilakukan setelah lokasi yang tepat
ditemukan (lokasi tidak ditentukan oleh user sendiri ).
2. Update
Update ini seperti yang ada pada Binary Tree biasa, namun di sini update
akan berpengaruh pada posisi node tersebut selanjutnya. Bila update
mengakibatkan tree tersebut bukan Binary Search Tree lagi, harus
dilakukan perubahan pada tree dengan melakukan rotasi supaya tetap
menjadi Binary Search Tree.
3. Delete
Seperti halnya update, delete dalam Binary Search Tree juga turut
mempengaruhi struktur dari tree tersebut.
69
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.
Selain AVL Tree, terdapat pula Height Balanced n Tree, yakni Binary Search
Tree yang memiliki perbedaan level antara subtree kiri dan subtree kanan
maksimal adalah n sehingga dengan kata lain AVL Tree adalah Height
Balanced 1 Tree.
Untuk memudahkan dalam menyeimbangkan tree, digunakan simbol-
simbol Bantu :
- (tanda minus) : digunakan apabila Subtree kiri lebih panjang dari
Subtree kanan.
+ (tanda plus) : digunakan apabila Subtree kanan lebih panjang dari
Subtree kiri.
0 (nol) : digunakan apabila Subtree kiri dan Subtree kanan
mempunyai height yang sama.
1
DAFTAR PUSTAKA
Sitorus, Lamhot. Sembiring, David J.M., 2012, Konsep dan Implementasi
Struktur Data dengan C++, Andi, Yogyakarta.
A.S., Rosa. Shalahuddin, M., 2010, Modul Pembelajaran Struktur Data,
Modula, Bandung.
Kadir, Abdul. Heriyanto, 2006, Algoritma Pemrograman menggunakan C++,
Andi, Yogyakarta.
_________, 2011, Bahan ajar dan Modul Praktikum Struktur Data, Lab.
Pemrograman dan RPL, ITN Malang.
Fachrurrozi, M., 2009, Modul Praktikum Struktur Data, Comlabs Fakultas
Ilmu Komputer, Universitas Sriwijaya.