Anda di halaman 1dari 73

STRUKTUR DATA

DIKTAT KULIAH

FAKULTAS ILMU KOMPUTER UNIVERSITAS MUHAMMADIYAH RIAU


2013

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

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

ii

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 keNilai

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.

Output:

2.

Output:

Atau

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:
0 1 21 43 34 12 2 23 65 23 32 3 43 12 56 23 4 45 21 54 56 5 78 12 34 76 6 65 21 45 45

0 1 2 3

10 45 32 11

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; 4

papan[1][2] = true; papan[1][4] = false;

Contoh program:

Output:

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, masingmasing 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:

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.

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 85 >= nilai akhir > 70 70 >= nilai akhir > 55 55 >= nilai akhir > 40 Nilai akhir <=40 :A :B :C :D :E

10

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.

11

Contoh Program: 1.

Output:

2.

Output:

12

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 :

13

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.

14

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.

15

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


main() { . . X = Jumlah(a,b); } return ( a + b ); Parameter formal Parameter aktual float Jumlah (int x, int y) {

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
16

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.

17

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.

18

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:

NULL

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

19

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:

20

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.

21

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.

22

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.

23

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.

24

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.

25

Ilustrasi :

26

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 27

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; }

28

2. Penambahan a. Tambah depan

Ilustrasi:

b. Tambah belakang

29

30

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, 31 kemudian

menghapus variabel hapus dengan menggunakan perintah delete. Jika tail masih NULL maka berarti data masih kosong! b. Hapus belakang

32

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

33

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.

34

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

35

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.

36

Ilustrasi :

37

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.

38

Ilustrasi:

39

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:

40

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

41

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; 42

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

43

44

b. Tambah belakang Penambahan node di belakang akan selalu dikaitkan dengan tail dan kemudian node baru tersebut akan menjadi tail

45

3. Penghapusan a. Hapus depan

Ilustrasi:

46

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:

47

48

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 Pop Clear IsEmpty IsFull Untuk menambahkan item pada tumpukan paling atas Untuk mengambil item teratas Untuk mengosongkan stack Untuk memeriksa apakah stack kosong Untuk memeriksa apakah stack sudah penuh

49

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.

50

Contoh Stack dengan Array


#include <iostream.h> #include <conio.h> #define MaxS 10 struct Stack { X char Isi[MaxS]; C unsigned int Top; }; void N void void void INITS (Stack &S); PUSH(Stack &S, char Data); CETAK(Stack S); 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 : ;

51

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!

52

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 operasioperasi 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. 53

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

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)*(CD) 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 dan terakhir hasilnya akan dikalikan. A+B*CD 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 (CD)

55

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)*(CD) =[+AB]*[-CD] =*[+AB][-CD] =*+AB-CD Contoh notasi prefix dari notasi infix :

Infix

Prefix +AB -+ABC *+ABC D

A+B A+BC (A+B)*(CD)

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

Test nilai R . Jika R adalah : Operand : Langsung ditulis Kurung buka Kurung tutup : Push kedalam tumpukan : 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) =[62-]*[54+] =[62-][54+]* =62-54+*

57

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 DeQueue Clear IsEmpty IsFull Memasukkan data ke dalam antrian Mengeluarkan data terdepan dari antrian Menghapus seluruh antrian Memeriksa apakah antrian kosong 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 58

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

59

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.

60

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.

61

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

62

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 Successor Ancestor Node yang berada di atas node tertentu Node yang berada dibawah node tertentu 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 Child Sibling Predecessor satu level di atas suatu node Successor satu level di bawah suatu node 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 Height Root Banyaknya node dalam suatu tree Banyaknya tingkatan / level dalam suatu tree Satu-satunya node khusus dalam tree yang tak punyak predecessor Leaf Degree Node-node dalam tree yang tak memiliki successor Banyaknya child yang dimiliki suatu node

63

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 H dijadikan sebagai root A < H : A menjadi subtree kiri

K > H : K menjadi subtree kanan H C < H ---> C > A : C menjadi subtree kanan dari A. :B B < H ---> B > A --->B < C 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:

64

Gambar Diagram Pohon

Gambar Diagram Venn

65

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.

66

8.3. Operasi-operasi pada Binary Tree Create Clear Empty Insert Membentuk binary tree baru yang masih kosong Mengosongkan binary tree yang sudah ada Function untuk memeriksa apakah binary tree masih kosong 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, masingmasing 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

67

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

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 simbolsimbol Bantu : - (tanda minus) Subtree kanan. + (tanda plus) Subtree kiri. 0 (nol) mempunyai : digunakan apabila Subtree kiri dan Subtree kanan height yang sama. : digunakan apabila Subtree kanan lebih panjang dari : digunakan apabila Subtree kiri lebih panjang dari

69

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.