Diktat Struktur Data (Ok)

73
FAKULTAS ILMU KOMPUTER UNIVERSITAS MUHAMMADIYAH RIAU STRUKTUR DATA DIKTAT KULIAH 2013

description

Diktat Struktur Data (Ok)

Transcript of Diktat Struktur Data (Ok)

Page 1: Diktat Struktur Data (Ok)

FAKULTAS ILMU KOMPUTER UNIVERSITAS MUHAMMADIYAH RIAU

STRUKTUR DATA DIKTAT KULIAH

2013

Page 2: Diktat Struktur Data (Ok)

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

Page 3: Diktat Struktur Data (Ok)

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

Page 4: Diktat Struktur Data (Ok)

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.

Page 5: Diktat Struktur Data (Ok)

2

Output:

2.

Page 6: Diktat Struktur Data (Ok)

3

Output:

Atau

Page 7: Diktat Struktur Data (Ok)

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

Page 8: Diktat Struktur Data (Ok)

5

papan[1][2] = true;

papan[1][4] = false;

Contoh program:

Page 9: Diktat Struktur Data (Ok)

6

Output:

Page 10: Diktat Struktur Data (Ok)

7

Page 11: Diktat Struktur Data (Ok)

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:

Page 12: Diktat Struktur Data (Ok)

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.

Page 13: Diktat Struktur Data (Ok)

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

Page 14: Diktat Struktur Data (Ok)

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.

Page 15: Diktat Struktur Data (Ok)

12

Contoh Program:

1.

Output:

2.

Output:

Page 16: Diktat Struktur Data (Ok)

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 :

Page 17: Diktat Struktur Data (Ok)

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.

Page 18: Diktat Struktur Data (Ok)

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.

Page 19: Diktat Struktur Data (Ok)

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

Page 20: Diktat Struktur Data (Ok)

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.

Page 21: Diktat Struktur Data (Ok)

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.

Page 22: Diktat Struktur Data (Ok)

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

Page 23: Diktat Struktur Data (Ok)

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:

Page 24: Diktat Struktur Data (Ok)

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.

Page 25: Diktat Struktur Data (Ok)

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.

Page 26: Diktat Struktur Data (Ok)

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.

Page 27: Diktat Struktur Data (Ok)

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.

Page 28: Diktat Struktur Data (Ok)

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.

Page 29: Diktat Struktur Data (Ok)

26

Ilustrasi :

Page 30: Diktat Struktur Data (Ok)

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

Page 31: Diktat Struktur Data (Ok)

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;

}

Page 32: Diktat Struktur Data (Ok)

29

2. Penambahan

a. Tambah depan

Ilustrasi:

b. Tambah belakang

Page 33: Diktat Struktur Data (Ok)

30

Page 34: Diktat Struktur Data (Ok)

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

Page 35: Diktat Struktur Data (Ok)

32

menghapus variabel hapus dengan menggunakan perintah delete.

Jika tail masih NULL maka berarti data masih kosong!

b. Hapus belakang

Page 36: Diktat Struktur Data (Ok)

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

Page 37: Diktat Struktur Data (Ok)

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.

Page 38: Diktat Struktur Data (Ok)

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

Page 39: Diktat Struktur Data (Ok)

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.

Page 40: Diktat Struktur Data (Ok)

37

Ilustrasi :

Page 41: Diktat Struktur Data (Ok)

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.

Page 42: Diktat Struktur Data (Ok)

39

Ilustrasi:

Page 43: Diktat Struktur Data (Ok)

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:

Page 44: Diktat Struktur Data (Ok)

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

Page 45: Diktat Struktur Data (Ok)

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;

Page 46: Diktat Struktur Data (Ok)

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

Page 47: Diktat Struktur Data (Ok)

44

Page 48: Diktat Struktur Data (Ok)

45

b. Tambah belakang

Penambahan node di belakang akan selalu dikaitkan dengan tail dan

kemudian node baru tersebut akan menjadi tail

Page 49: Diktat Struktur Data (Ok)

46

3. Penghapusan

a. Hapus depan

Ilustrasi:

Page 50: Diktat Struktur Data (Ok)

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:

Page 51: Diktat Struktur Data (Ok)

48

Page 52: Diktat Struktur Data (Ok)

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

Page 53: Diktat Struktur Data (Ok)

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.

Page 54: Diktat Struktur Data (Ok)

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 : “;

Page 55: Diktat Struktur Data (Ok)

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!

Page 56: Diktat Struktur Data (Ok)

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.

Page 57: Diktat Struktur Data (Ok)

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.

Page 58: Diktat Struktur Data (Ok)

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

Page 59: Diktat Struktur Data (Ok)

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 )

Page 60: Diktat Struktur Data (Ok)

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 + *

Page 61: Diktat Struktur Data (Ok)

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

Page 62: Diktat Struktur Data (Ok)

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

Page 63: Diktat Struktur Data (Ok)

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.

Page 64: Diktat Struktur Data (Ok)

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.

Page 65: Diktat Struktur Data (Ok)

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).

Page 66: Diktat Struktur Data (Ok)

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

Page 67: Diktat Struktur Data (Ok)

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:

Page 68: Diktat Struktur Data (Ok)

65

Gambar Diagram Pohon

Gambar Diagram Venn

Page 69: Diktat Struktur Data (Ok)

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.

Page 70: Diktat Struktur Data (Ok)

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

Page 71: Diktat Struktur Data (Ok)

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.

Page 72: Diktat Struktur Data (Ok)

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.

Page 73: Diktat Struktur Data (Ok)

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.