You are on page 1of 136

STRUKTUR DATA

Pengajar
Jaidan Jauhari, MT
Alamat Email
jaidan_j@ilkom.unsri.ac.id
jaidan_j@yahoo.com

Disarikan Dari Berbagai Sumber, Terutama Dari Diktat Struktur Data Informatika
ITB Karangan Dr. Inggriani Liem
Halaman 1
SILABUS MATERI KULIAH
z Pengantar Struktur Data
z Review Record dan Array
z Stack (Tumpukan)
z Queue (Antrian)
z Linked List dan Variasi List
z MultiList
z Pohon Biner
z Graph

Halaman 2
BUKU SUMBER
1. Inggriani Liem. 1997. Diktat Kuliah Algoritma dan
Pemrograman Prosedural. Bandung : ITB
2. Inggriani Liem. 2003. Diktat Kuliah Struktur Data.
Bandung : ITB
3. Rinaldi Munir. 2003. Algoritma dan Pemrograman II.
Bandung : Penerbit Informatika
4. Bambang Wahyudi. 2004. Struktur Data dan Algoritma.
Yogyakarta : Andi Offset
5. Dwi Sanjaya. 2001. Bertualang dengan Struktur Data di
Planet Pascal. Yogyakarta : JJ Learning
6. P. Insap Santoso.1997. Struktur Data dengan Turbo
Pascal. Yogyakarta : Andi Offset

Halaman 3
Komponen Penilaian

z Tugas 20%
z Ujian 1 20 % (Pertemuan ke-4)
z Ujian 2 20% (Pertemuan ke-8)
z Ujian 3 20% (Pertemuan ke-12)
z Ujian Akhir Semester 20%

Halaman 4
Aturan dan Sanksi-sanksi
z Kehadiran minimal 80%, kurang dari 80%
tidak lulus (mendapat nilai E)
z Keterlambatan maksimal 10 menit (Lebih dari 10 menit tidak
diijinkan memasuki ruangan)
z Pengumpulan Tugas yang melebihi waktu yang telah ditentukan
akan diberikan nilai nol
z Kecurangan dalam bentuk apapun akan mendapatkan nilai E
z Mahasiswa berpakaian rapi dan sopan, yang ditunjukkan antara lain
1. Memakai sepatu tertutup
2. Memakai baju berkerah
3. Tidak memakai aksesoris yang tidak diijinkan
4. Tidak memakai pakaian yang kurang dasar atau lebih dasar
5. dan lain-lain
z Selama perkuliahan berlangsung mahasiswa tidak diijinkan
meninggalkan ruang kuliah kecuali sangat terpaksa dan itupun
harus membuat surat ijin dan hanya boleh satu kali

Halaman 5
PENGERTIAN STRUKTUR DATA
Struktur data adalah cara menyimpan atau
merepresentasikan data di dalam komputer agar
bisa dipakai secara efisien

Sedangkan data adalah representasi dari fakta dunia


nyata.

Fakta atau keterangan tentang kenyataan yang


disimpan, direkam atau direpresentasikan dalam
bentuk tulisan, suara, gambar, sinyal atau
simbol
Halaman 6
Secara garis besar type data dapat dikategorikan
menjadi :
1. Type data sederhana
a. Type data sederhana tunggal, misalnya
Integer, real, boolean dan karakter
b. Type data sederhana majemuk, misalnya
String
2. Struktur Data, meliputi
a. Struktur data sederhana, misalnya array dan
record

Halaman 7
b. Struktur data majemuk, yang terdiri
dari
Linier : Stack, Queue, serta List dan
Multilist
Non Linier : Pohon Biner dan Graph

Pemakaian struktur data yang tepat di dalam


proses pemrograman akan menghasilkan
algoritma yang lebih jelas dan tepat,
sehingga menjadikan program secara
keseluruhan lebih efisien dan sederhana.

Halaman 8
Struktur data yang ″standar″ yang biasanya
digunakan dibidang informatika adalah :
z List linier (Linked List) dan variasinya
z Multilist
z Stack (Tumpukan)
z Queue (Antrian)
z Tree ( Pohon )
z Graph ( Graf )

Halaman 9
REVIEW RECORD (REKAMAN)

Disusun oleh satu atau lebih field. Tiap field


menyimpan data dari tipe dasar tertentu atau dari
tipe bentukan lain yang sudah didefinisikan
sebelumnya. Nama rekaman ditentukan oleh
pemrogram.
Rekaman disebut juga tipe terstruktur.

Contoh :
1. type Titik : record <x : real, y : real>
jika P dideklarasikan sebagai Titik maka
mengacu field pada P adalah P.x dan P.y.

Halaman 10
2. Didefinisikan tipe terstruktur yang mewakili Jam
yang dinyatakan sebagai jam (hh), menit (mm)
dan detik (ss), maka cara menulis type Jam
adalah :
type JAM : record
<hh : integer, {0…23}
mm : integer, {0…59}
ss : integer {0…59}
>
Jika J adalah peubah (variabel) bertipe Jam
maka cara mengacu tiap field adalah J.hh, J.mm
dan J.ss

Halaman 11
Terjemahan dalam bahasa C :
1. type Titik : record <x : real, y : real>
diterjemahkan menjadi :
typedef struct { float x;
float y;
} Titik;
2. type JAM : record
<hh : integer, {0…23}
mm : integer, {0…59}
ss : integer {0…59}
>
Diterjemahkan menjadi :
typedef struct
{ int hh; /*0…23*/
int mm; /*0…59*/
int ss; /*0…59*/
} Jam;

Halaman 12
REVIEW ARRAY (LARIK)
1. Pendahuluan
z Larik adalah struktur data statik yang
menyimpan sekumpulan elemen yang bertipe
sama.
z Setiap elemen diakses langsung melalui
indeksnya.
z Indeks larik harus tipe data yang menyatakan
keterurutan misalnya integer atau karakter.

Halaman 13
z Banyaknya elemen larik harus sudah diketahui
sebelum program dieksekusi.
z Tipe elemen larik dapat berupa tipe sederhana,
tipe terstruktur atau tipe larik lain.
z Nama lain array adalah Larik, tabel atau vektor

Halaman 14
Cara Pendefinisian Array
1. Sebagai Peubah
Contoh :
L : array[1..50] of integer
NamaMhs : array[‘a’..’j’] of string

2. Sebagai tipe baru


Contoh :
type LarikInt : array[1..100] of integer
P : LarikInt

Halaman 15
3. Mendefinisikan ukuran maksimum
elemen larik sebagai konstanta
Contoh :
Const Nmaks = 100
type Larikint : array[1..Nmaks] of integer
P : LarikInt

Cara menterjemahkan ke bahasa C :


#define Nmaks 100
typedef int Larikint[Nmaks+1];
Larikint P;

Halaman 16
Cara Mengacu Elemen Larik

z Elemen larik diacu melalui indeksnya.


Nilai indek harus terdefinisi.

z Contoh cara mengacu elemen larik adalah :


L[4] {mengacu elemen keempat dari larik L }
NamaMhs[‘b’] {mengacu elemen kedua
dari larik NamaMhs}
P[k] {mengacu elemen ke-k dari larik P,
asalkan nilai k sudah terdefinisi }

Halaman 17
Menginisialisasi Larik

z menginisialisasi elemen larik adalah memberikan


harga awal untuk seluruh elemen larik, misalnya
menginisialisasi dengan nilai 0 seperti di bawah ini :
Procedure InisDgn0(output A:larik, input N:integer)
{menginisialisasi setiap elemen larik A[1..N] dengan nol}
{K. Awal : N adalah banyak elemen efektif larik,
nilainya terdefinisi}
{K. Akhir : seluruh elemen larik A bernilai nol}
Deklarasi :
K : integer
Deskripsi :
for k Å 1 to N do
A[k] Å 0
endfor

Halaman 18
Mengisi elemen larik dari piranti masukan

z Elemen larik dapat diisi dengan nilai yang dibaca dari


piranti masukan seperti contoh di bawah ini :
Procedure BacaLarik(output A:larik, input N:integer)
{mengisi elemen larik A[1..N] dengan nilai yang
dibaca dari piranti masukan}
{K. Awal : N adalah jumlah elemen efektif larik, nilainya
terdefinisi}
{K. Akhir : seluruh elemen larik A berisi nilai-nilai yang dibaca dari
piranti masukan}
Deklarasi :
K : integer
Deskripsi :
for k Å 1 to N do
read (A[k])
endfor

Halaman 19
Larik Bertype Terstruktur

Larik tidak hanya dapat berisi data bertype tunggal,


tapi dapat juga berisi data yang bertipe
terstruktur
Contoh :
const Nmaks = 100
type Mahasiswa : record
<nim : integer,
nama_mhs : string,
KodeMK : string,
Nilai : char >
TabMhs : array[1..Nmaks] of Mahasiswa

Halaman 20
Contoh Cara mengacu elemen TabMhs :
1. TabMhs[2].Nim
mengacu field Nim dari elemen kedua
larik
2. Write(TabMhs[k].KodeMK)
menuliskan field KodeMK dari elemen
ke k dari larik

Halaman 21
Tugas 1
Buatlah dalam notasi algoritma atau bahasa C :
1.Definisikan sebuah type terstruktur untuk
menyatakan data nasabah disebuah bank. Data
nasabah terdiri atas field Nomor Account, Nama
Nasabah, Alamat Nasabah, Kota Nasabah, dan
Nomor Telpon Nasabah.
Untuk setiap field definisikan type data yang cocok

Halaman 22
2.Dari soal nomor 1 buatlah program dalam
bahasa pemrograman berbasis bahasa C, untuk
memasukkan data nasabah sebanyak N, dengan
N diinputkan dari papan ketik, kemudian
menuliskan kembali semua data nasabah dalam
bentuk matrik.
Petunjuk :
Gunakan notasi pengulangan untuk
menyelesaikan permasalahan tersebut

Tugas dikumpulkan pada pertemuan


berikutnya disertai listing program dan
contoh keluarannya

Halaman 23
ADT (Abstract Data Type)
z ADT adalah definisi type dan sekumpulan
primitif (operasi dasar) terhadap type
tersebut.
z Type diterjemahkan menjadi type terdefinisi
dalam bahasa pemrograman yang
bersangkutan, misalnya menjadi record dalam
Pascal/Ada dan Struct dalam bahasa C

Halaman 24
Primitif dalam konteks pemrograman
prosedural, diterjemahkan menjadi
fungsi dan prosedur.
Primitif dikelompokkan menjadi :
1. Konstruktor/Kreator, pembentuk nilai
type. Biasanya namanya diawali dengan
Make.
2. Selektor, untuk mengakses komponen type.
Biasanya namanya diawali dengan
Get.
Halaman 25
3. Prosedur Pengubah nilai komponen
4. Validator komponen type, yang
dipakai untuk mengetes apakah dapat
membentuk type sesuai batasan.
5. Destruktor/Dealokator, yaitu untuk
menghancurkan nilai objek, sekaligus
memori penyimpannya
6. Baca/tulis, untuk interface dengan
input/output device

Halaman 26
7. Operator Relasional terhadap type
tersebut untuk mendefinisikan lebih
besar, lebih kecil, sama dengan dan
sebagainya.
8. Aritmatika terhadap type tersebut,
dalam pemrograman biasanya hanya
terdefinisi untuk bilangan numerik.
9. Konversi dari type tersebut ke type
dasar dan sebaliknya

Halaman 27
ADT biasanya diimplementasi menjadi dua buah
modul, yaitu :
1. Definisi/spesifikasi type dan primitif
- Spesifikasi type sesuai dengan
bahasa yang dipakai
- Spesifikasi dari primitif sesuai dengan kaidah
dalam konteks prosedural, yaitu :
a. Fungsi : nama, domain, range, dan pre kondisi
jika ada
b. Prosedur : Keadaan Awal, Keadaan Akhir dan
proses yang dilakukan
2. Body/realisasi dari primitif, berupa kode program dalam
bahasa yang bersangkutan. Realisasi fungsi dan prosedur
harus sedapat mungkin memanfaatkan Selektor dan
Konstruktor

Halaman 28
Halaman 29
4. Linked List (List Linier)
4.1. Definisi
List linier adalah sekumpulan elemen
bertype sama, yang mempunyai
keterurutan tertentu, yang setiap
elemennya terdiri dari 2 bagian :

Type Elmtlist = record


< Info : InfoType,
Next : address >
Halaman 30
Dengan Info Type adalah sebuah type
terdefenisi yang menyimpan informasi
sebuah elemen list ; Next adalah address
dari elemen berikutnya ( suksesor ).

Dengan demikian, jika didefinisikan First


adalah alamt elemen pertama list, maka
elemen berikutnya dapat diakses secara
suksesif dari elemen pertama tersebut

Halaman 31
Jadi, sebuah list linier dikenali :
z elemen pertamanya, biasanya melalui alamat
elemen pertama yang disebut : First
z alamat elemen berikutnya ( suksesor ), jika
kita mengetahui alamat sebuah elemen , yang
dapat diakses melalui field NEXT
z setiap elemen mempunyai alamat, yaitu
tempat elemen disimpan dapat diacu.Untuk
mengacu sebuah elemen , alamat harus
terdefenisi . Dengan alamat tersebut Informasi
yang tersimpan pada elemen list dapat diakses
.
z elemen terakhirnya. Ada berbagai cara untuk
mengenali elemen akhir
Halaman 32
Jika L adalah list , dan P adalah address :
Alamat elemen pertama list L dapat diacu
dengan notasi :
First (L)
Elemen yang diacu oleh P dapat dikonsultasi
informasinya dengan notasi :
Info(P)
Next(P)

Halaman 33
Beberapa defenisi :
1. List L adalah List kosong , jika First (L) = Nil
2. Elemen terakhir dikenali, dengan salah satu
cara adalah karena Next(Last) =Nil

Halaman 34
II. Skema traversal untuk list
linier
List terdiri dari sekumpulan elemen.
Seringkali diperlukan untuk memproses
setiap elemen list dengan cara yang sama.
Karena itu salah primitif operasi konsultasi
dasar pada struktur list adalah traversal,
yaitu “mengunjungi” setiap elemen list
untuk diproses.

Halaman 35
Karena Urutan akses adalah dari elemen
pertama sampai dengan elemen
terakhir, maka traversal list secara
natural dilakukan dari elemen pertama,
suksesornya, dan seterusnya sampai
dengan elemen terakhir.

Halaman 36
Skema traversal yang dipakai adalah Sbb :

Procedure SKEMAListTransversal1( Input L : List )


{K. Awal : List L terdefinisi , mungkin kosong }
{K. Akhir : semua elemen list L dikunjungi dan telah
diproses }
{Proses : Traversal sebuah list linier. Dengan MARK,
tanpa pemrosesan khusus pada list kosong}

Deklarasi

Halaman 37
Deklarasi :
P : address { address untuk traversal , type
terdefenisi }
Deskripsi :
Inisialisasi
P ← First ( L ) { First Element }
While ( P ≠Nil ) do
Proses ( P )
P ← Next ( P ) { Next element }
endwhile
Terminasi
Halaman 38
Procedure SKEMAListTransversal 2( Input L :
List )
{ K. Awal : List L terdefenisi , mungkin kosong }
{ K. Akhir : semua elemen list L “dikunjungan “
dan telah diproses }
{ Proses : Transversal sebuah list linier yang
diidentifikasi oleh elemen pertama L ,
Dengan MARK dan pemrosesan
khusus pada list kosong }

Deklarasi :

Halaman 39
Deklarasi
P : address { address untuk traversal , type
terdefenisi }
Deskripsi
If (First ( L ) = Nil) then
Write ( ‘List kosong ‘ )
else

Halaman 40
Insialisasi
P ← First ( L ) { First Element }
Repeat
Proses ( P )
P ← Next ( P ) { Next element }
until P=Nil
Terminasi

Halaman 41
III. Skema Sequential Search untuk list
linier
Selain traversal, proses pencarian suatu elemen
list adalah primitif yang sering kali
didefinisikan pada struktur list. Pencarian
dapat berdasarkan nilai, atau berdasarkan
alamat.
III.1. Search suatu Nilai, output adalah address
Search ini sering dipakai untuk mengenali
suatu elemen list berdasarkan nilai informasi
yang disimpan pada elemen yang dicari.
Biasanya dengan alamat yang ditemukan,
akan dilakukan suatu proses terhadap elemen
list tersebut. Halaman 42
Procedure SKEMAListSearch1 ( Input L : List,
X : InfoType, Output P :
address, Found: Boolean )
{ K. Awal : List linier L sudah terdefinisi dan siap
dikonsultasi, X terdefenisi }
{ K.Akhir : P : address pada pencarian beurutan,
dimana X diketemukan, P = Nil jika
tidak ketemu, Found berharga true jika
harga X yang dicari ketemu, false jika
tidak }

Halaman 43
{Proses : Sequential Search harga X pada sebuah
list linier L, Semua elemen diperiksa
dengan intruksi yang sama, versi
dengan Boolean}

Deklarasi

Deskripsi

Halaman 44
P ← First ( L )
Found ← false
While ( P ≠ Nil ) and ( not found ) do
if X = Info (P) then
Found ←True
else
P ← Next (P)
endif
endwhile { P = Nil or Found}
{Jika Found maka P adalah address dimana
harga yang dicari diketemukan}
Halaman 45
III. 2. Search suatu Elemen yang
beralamat tertentu
Procedure SKEMAList Search@( Input L : List, P :
address, Found: Boolean )
{K. Awal : List linier L sudah terdefinisi dan siap
dikonsultasi, X terdefenisi }
{K.Akhir : Jika ada elemen list beralamat P, Found
berharga true, Jika tidak ada elemen list
beralamat P, Found berharga false }
{Proses : Sequential Search @ P pada sebuah list linier
L, Semua elemen diperiksa dengan intruksi
yang sama }
Halaman 46
Deklarasi
Pt : address
Deskripsi
Pt ← First ( L )
Found ← false
While ( Pt ≠ Nil ) and ( not found ) do
if Pt = P then
Found ← true
else
Pt ← Next (Pt)
endif
endwhile { Pt = Nil or Found}
{ Jika Found maka P adalah elemen list}

Halaman 47
IV. Definisi fungsional list linier dan
algoritmanya
Secara fungsional, pada sebuah list linier
biasanya dilakukan pembuatan,
penambahan atau penghapusan elemen yang
dapat ditulis sebagai berkut :
Jika diberikan L, L1 dan L2 adalah list
linier dengan elemen ElmtList, maka
operasi yang dapat dilakukan :
ListEmpty, CreateList, Insert,
Delete, Concat dan UpdateList

Halaman 48
IV. 1. Pengetesan List Kosong
Pemeriksaan apakah sebuah list kosong sangat
penting, karena Keadaan Awal dan
Keadaan Akhir beberapa prosedur harus
didefinisikan berdasarkan keadaan list.
Operasi pada list kosong sering kali
membutuhkan penanganan khusus
Realisasi algoritmik dari definisi
fungsional ini adalah sebuah fungsi
sebagai berikut.

Halaman 49
Function IsEmptyList (L : List ) → boolean
{ Test apakah sebuah list L kosong,
Mengirimkan true jika list kosong, false
jika tidak kosong}
Deklarasi
Deskripsi
return(First (L) = Nil)

Halaman 50
IV.2 Pembuatan sebuah elemen pada
list linier
Pembuatan sebuah list berarti membuat
sebuat list KOSONG, yang selanjutnya
siap diproses (ditambah elemennya,
dsb). Realisasi algoritmik dari
defenisi funfsional ini adalah sebuah
prosedur sebagai berikut.

Halaman 51
Procedure CreateList( Output L : List )
{K. Awal : Sembarang }
K. Akhir : terbentuk list L yang kosong : First
(L) diinisialisasi dengan NIL )
Proses : Membuat list kosong}
Deklarasi
Deskripsi
First (L) ← Nil

Halaman 52
IV. 3 Penyisipan sebuah elemen
pada list linier
Fungsi insert (penyisipan) harus dijabarkan lebih
rinci, karena dapat menjadi penyisipan sebagai
elemen pertama, setelah sebuah address P atau
penyisipan menjadi elemen terakhir atau
bahkan menjadi elemen ditengah
Penyisipan sebuah elemen dapat dilakukan
terhadap sebuah elemen yang sudah dialokasi
(diketahui address-nya ), atau sebuah elemen
yang hanya diketahui nilai Info-nya (berarti
belum dialokasi).
Halaman 53
IV. 2.1. INSERT-First (Address)
Menambahkan sebuah elemen yang diketahui
alamatnya sebagai elemen pertama list.
Procedure InsertFirst (Input/Output L:List, Input
P: address)
{K. Awal : List L mungkin kosong
{K. Akhir : P adalah elemen pertama list L}
{Proses : Insert sebuah elemen beralamat P sebagai
elemen pertama list linier L yang mungkin
kosong}
Deklarasi
Deskripsi
Next (P) ← First (L)
First (L) ← P
Halaman 54
IV.2.2 INSERT-First (Nilai)
Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama
list.

Procedure InsFirst (Input/output L :List, Input E : infotype )


{ K. Awal : List L mungkin kosong }
{ K. Akhir : Sebuah elemen dialokasikan dan menjadi elemen
pertama list L, jika alokasi berhasil. Jika alokasi gagal
list tetap seperti semula }
{ Proses : Insert sebuah elemen sebagai elemen pertama list}
Deklarasi
P : address
Deskripsi
Alokasi (P)
If P ≠ Nil then
Info (P) ← E
Next (P) ← First (L)
First (L) ← P
Halaman 55
IV.2.2. INSERT-AFTER
Menyisipkan sebuah elemen beralamat P sebagai
suksesor dari sebuah elemen list linier yang beralamat
Prec

Procedure InsertAfter ( Input P, Prec: address )


{K. Awal : Prec adalah elemen list, prec ≠ Nil, P sudah
dialokasikan, P ≠ Nil, Next (P) = Nil
K. Akhir : P menjadi suksesor Prec
Proses : Insert sebuah elemen beralamat P pada List
linier L}
Deklarasi
Deskripsi
Next (P) ← Next (Prec)
Next (Prec) ← P
Halaman 56
IV. 2.3. INSERT – Last
Menyisipkan sebuah elemen beralamat P sebagai elemen
terakhir sebuah list linier. Ada dua kemungkinan list
kosong atau tidak kosong

Procedur InsertLast@(Input/Output L: List, Input P :


address)
{K. Awal : List L mungkin kosong, P sudah dialokasi,
P ≠ Nil, Next (P) = Nil
K. Akhir : P adalah elemen terakhir list L
Proses : Insert sebuah elemen beralamat P sbg elemen
terakhir dari list linier L yg mungkin kosong }
Halaman 57
Deklarasi
Last : address { address untuk traversal}
Deskripsi
If Fisrt (L) = Nil then { insert sebagai elemen pertama}
InsertFirst(L, P)
Else
{ Traversal list sampai address terakhir}
Last ← First (L)
While (Next (Last ) ≠ Nil ) do
Last ← Next (Last )
endwhile {Next ( Last) = Nil, Last adalah elemen terakhir;
insert P after last }
InsertAfter (P, Last)
endif

Halaman 58
Procedure InsertLast(Input/output L :List, Input E : Infotype)
{ K. Awal : List L mungkin kosong, P sudah dialokasi,
P ≠ Nil, Next(P)=Nil
K. Akhir : P adalah elemen terakhir list L
Proses : Insert sebuah elemen beralamat P sebagai
elemen terakhir dari list linier L yang mungkin
kosong }
Deklarasi
Last : address { address untuk traversal }

Deskripsi
Alokasi (P)
If (P ≠ Nil) then
Info(P) ←E
InsertLast@(L,P)

Halaman 59
IV.3. Penghapusan sebuah elemen pada list
linier
Penghapusan harus dijabarkan lebih rinci, Karena
penghapusan elemen dapat merupakan
pertama, setelah sebuah address P atau
penghapusan elemen terakhir. Perbedaan ini
melehirkan 3 operasi dasar penghapusan
elemen list yang diturunkan dari definisi
fungsional inimenjadi realisasi algoritma.

Operasi penghapusan dapat mengakibatkan list


kosong, jika list semula hanya terdiri dari satu
elemen.

Halaman 60
IV.3.1. DELETFirst : menghapus elemen pertama
list linier
a. Elemen yang dihapus dicatat alamatnya
Procedure DeleteFirst@ (Input/Output L : List, Output
P : address)
{K. Awal : List L tidak kosong, minimal 1 elemen
pertama pasti ada }
{K. Akhir : menghapus elemen pertama L
P adalah @ elemen pertama L sebelum
penghapusan, L yang baru adalah Next (L)
Deklarasi
Deskripsi
P ← First (L)
First (L) ← Next ( First (L) )

Halaman 61
Procedure DeleteFirst (Input/Output L : List, Output E :
InfoType)
{K. Awal : List L tidak kosong, minimal 1 elemen
pertama pasti ada }
{K. Akhir : menghapus elemen pertama L
E adalah Nilai elemen pertama L sebelum
penghapusan, L yang baru adalah Next (L)
Deklarasi
Deskripsi
P ← First (L)
E ← Info (P)
First (L) ← Next ( First (L) )
Dealokasi (P)

Halaman 62
IV. 3.2. Delete After :
Penghapusan suksesor sebuah elemen :
Procedure DeleteAfter ( Input Prec : adrress, Output
P : address )
{ K. Awal : List tidak kosong, Prec adalah elemen list
, Next (Prec) ≠ Nil } Prec ≠elemen terakhir
K. Akhir : Menghapus suksesor Prec, P adalah @
suksesor Prec sebelum penghapusan, Next
(Prec) yang baru adalah suksesor dari
suksesor Prec sebelum penghapusan }
Deklarasi
Deskripsi
P ← Next (Prec)
Next (Prec) ← Next (Next (Prec))

Halaman 63
Dengan primitip ini, maka penghapusan sebuah
beralamat P dapat dilakukan dengan : mencari
predesesor dari P, yaitu alamat Prec memakai
DeleteAfter (Prec)

Procedure DeleteP ( Input/Output L ; List, Output


P : address )
{ K. Awal : List L tidak kosong , P adalah elemen list
L K. Akhir : Menghapus P dari list, P mungkin
elemen pertama, “tengah” atau terakhir }
Deklarasi
Prec : address { alamat predesesor }
Deskripsi
Halaman 64
{ Cari predesesor P }
if (P = First (L) then {Delete list dengan
satu elemen }
DeleteFirst (L,P)
else
Prec ← First (L)
While (Next(Prec) ≠ P ) do
Prec ← Next (Prec)
endwhile { Next (Prec) = P , hapus P }
DeleteAfter (Prec , P)
endif
Halaman 65
IV. 3.3. DELETELast :
Menghapus elemen terakhir list dapat dilakukan jika
alamat dari elemen sebelum elemen terakhir
diketahui. Persoalan selanjutnya menjadi persoalan
DeleteAfter, kalau last bukan satu- satunya elemen
list linier. Ada dua kasus, yaitu list menjadi kosong
atau tidak.

Procedure DeleteLast (Input L : List, Output P :


address)
{K. Awal : List L tidak kosong, minimal mengandung
1 elemen
K. Akhir : menghapus elemen terakhir dari list, list
mungkin menjadi kosong
Proses : P adalah alamat elemen terakhir list
sebelum penghapusan }
Halaman 66
Deklarasi
Last , preclast :address { address untuk traversal }
Deskripsi
{ Find last dan address sebelum last }
Last ← First (L)
Preclast ← Nil { predesesor dari L tak terdefenisi }
While ( Next ( Last ) ≠ Nil do { Traversal list sampai @ terakhir
}
Preclast ← Last ; Last ← Next ( last )
endwhile { Next ( Last ) = Nil, Last adalah elemen terakhir;
preclast = sebelum last }
P ← Last
If Preclast = Nil then { list dg 1 elemen, jadi kosong }
First(L) ← Nil
Else
Next ( preclast )← Nil
endif
Halaman 67
IV. 5. Konkatenasi dua buah list linier
Concat adalah menggabungkan dua list. Dalam contoh
berikut list kedua disambungkan ke list pertama. Jadi
Last (L1) menjadi predesesor First (L2). Realisasi
algoritma adalah sebuah prosedur sebagai berikut :

Procedure CONCAT (Input L1, L2 : List, Output :


L3 : List )
{K. awal : L1 ≠ L2, L1 ≠ L3,dan L3 ≠ L2; L1, L2
mungkin kosong
K. Akhir : L3 adalah hasil konkatenasi (menyambung)
dua buah list linier, L2 ditaruh dibelakang
L1 }
Halaman 68
Deklarasi
Last1 : address { alamat elemen terakhir list pertama }
Deskripsi
Cratelist (L3) {inisialisasi list hasil }
If Fist (L1) = Nil then
First (L3) ← First (L2)
Else { Traversal list 1 sampai address terakhir,
Hubungkan last dengan Fisrt 2}
First (L3) ← First (L1)
Last1 ← First (L1)
While ( Next (Last 1 ) ≠ Nil ) do
Last1 ← Next (Last 1)
endwhile {Next ( Last 1) ← First (L2)}
Next(Last1) ← First (L2)}
endif

Halaman 69
Bagian Deklarasi dari algoritma pada List Linier :
Deklarasi
type InfoType = … {Sebuah type terdefinisi}
type Address pointer to ElmtL
type ElmtL = record
<Info : InfoType,
Next : Address >
type List = record <First : Address >
{Deklarasi Nama Peubah}
L : List
P : Address

Halaman 70
Soal-Soal Latihan
I. Apakah perbedaan struktur data list linier
ditinjau dari sudut pandang operasinya, jika
dibandingkan dengan struktur data stack
dan queue?
II. Untuk data yang bagaimanakah yang dapat
direpresentasikan dengan menggunakan
struktur data list linier?
III. Diketahui sebuah list linier dengan elemen
bertipe integer, buatlah :
1. Sebuah prosedur untuk menghitung
jumlah elemen list yang genap
2. Prosedur untuk menghitung rata-rata
elemen list yang ganjil
Halaman 71
3. Prosedur untuk menghitung banyaknya
elemen list yang positif (lebih besar dari
nol)
4. Prosedur untuk mencetak elemen list yang
genap

IV. Diketahui sebuah list dengan elemen bertype


integer terurut membesar, buatlah :
1. Fungsi untuk mengirimkan elemen pertama
list
2. Fungsi untuk mencari elemen list yang
minimum
3. Fungsi untuk menghitung banyaknya
elemen yang lebih besar dari 100
Halaman 72
Halaman 73
5. Stack (Tumpukan)
5.1. Definisi
STACK (Tumpukan) adalah list linier yang :
1. Dikenali elemen puncaknya (TOP)
2. Aturan penyisipan dan penghapusan
elemennya tertentu :
-Penyisipan selalu dilakukan “di atas “ TOP
-Penghapusan selalu dilakukan pada TOP
Halaman 74
Karena aturan penyisipan dan penghapusan semacam
itu, TOP adalah satu-satunya alamat tempat terjadi
operasi. Elemen yang ditambahkan paling akhir akan
menjadi elemen yang akan dihapus.Dikatakan
bahwa elemen Stack akan tersusun secara LIFO
(Last In First Out).
Maka secara lojik, sebuah STACK dapat
digambarkan sebagai list linier yang setiap
elemennya adalah
Type ElmtS = record
<Info : InfoType,
Next : address >
Halaman 75
dengan InfoType terdefinisi yang menentukan
informasi yang disimpan pada setiap
elemen stack, dan address adalah
“alamat” dari elemen
Selain itu alamat elemen terbaru (TOP) dicatat,
sedangkan alamat elemen yang paling
“bawah”, yaitu yang paling lama biasanya
diebut BOTTOM.
TOP adalah elemen pertama list, supaya
penambahan dan penghapusan dengan
mudah dan efisien dapat dilakukan.
Halaman 76
Sehingga jika S adalah sebuah Stack, dan P
adalah address maka
¾ Top (S) adalah alamat elemen TOP, dimana
operasi penyisipan/penghapusan dilakukan.
¾ Info (P) adalah informasi yang disimpan pada
alamat P
¾ Next (P) adalah alamat suksesor P
¾ ElmtS (P) adalah sebuah elemen stack yang
beralamat P
¾ Stack kosong adalah Stack dengan Top (S) =
Nil ( tidak terdefinisi )

Halaman 77
Bagian Deklarasi dari algoritma pada Stack :
Deklarasi
type InfoType = … {Sebuah type terdefinisi}
type Address pointer to ElmtS
type ElmtS = record
<Info : InfoType,
Next : Address >
type Stack = record <TOP : Address>
{Deklarasi Nama Peubah}
S : Stack
P : Address

Halaman 78
5.2. Traversal pada Stack
Pada stack, jarang sekali dilakukan
traversal, karena keunikan Stack justru
pada operasi yang hanya menyangkut
elemen TOP. Namun dibutuhkan
traversal misalnya untuk mencetak isi
Stack.
5.3. Search pada Stack
Pada stack, elemen yang diproses hanyalah
elemen pada TOP. Maka hampir tidak pernah
dilakukan search.
Halaman 79
5.4. Operasi dan fungsi dasar
pada STACK.
a. Test STACK kosong
Mengetahui bahwa stack kosong atau
tidak sangat penting, sebab semua operasi
akan dilakukan berdasarkan kosong atau
tidaknya suatu Stack. Realisasi algoritma
dari definisi fungsional ini adalah sebuah
fungsi yang melakukan test terhadap Stack
sebagai berikut :
Halaman 80
function StackEmpty (S : STACK) →
Boolean
{ TEST stack kosong : Mengirim true, jika
tumpukan kosong, false jika tumpukan tidak
kosong}
Deklarasi

Deskripsi
return (Top (S) = Nil)

Halaman 81
b. Pembuatan STACK kosong
Membuat Stack kosong diperlukan untuk memulai
memakai stack. Realisasi algoritma dari definisi
fungsional ini adalah sebuah prosedur yang
melakukan inisialisasi stack sebagai berikut

Procedure CreateEmptyS (Output S : STACK)


{K. Awal : sembarang,
K. Akhir : sebuah stack S yang kosong siap dipakai
terdefinisi
Proses : Membuat stack kosong }

Deklarasi
Deskripsi
Top (S) ← Nil

Halaman 82
c.Penambahan sebuah elemen pada
STACK (Push)
Penambahan selalu dilakukan pada TOP, dan
karena alamat TOP diketahui maka prosesnya
sederhana. Berikut ini akan diberikan skema
prosedur penyisipan tersebut. Realisasi algoritma
dari definisi fungsional ini adalah salah satu dari
dua buah prosedur yang melakukan penambahan
elemen stack sebagai berikut. Prosedur pertama
menambahkan suatu ElmtS yang diketahui
alamatnya dan yang kedua menambahkan suatu
nilai ElmtS yang diberikan.

Halaman 83
procedure Push@ (Input/Output S : STACK Input P :
address)
{Menambahkan sebuah elemen baru pada TOP sebuah
stack, dengan elemen yang diketahui alamatnya}
{K.Awal : Stack mungkin kosong, P terdefinisi (berarti
terdefinisi informasinya, Next (P) = Nil}
{K.Akhir : Top (S) adalah P}
Deklarasi
Deskripsi
{ insert sebagai elemen pertama }
Next (P) ← TOP (S)
TOP (S) ← P

Halaman 84
procedure Push( Input / Output S:STACK Input E: InfoType )
{ Menambahkan sebuah elemen baru pada TOP sebuah stack,
dengan elemen yang diketahui informasinya }
{ K. Awal : Stack mungkin kosong , E terdefenisi , alokasi alamat
selalu berhasil }
{ K. Akhir : TOP (S) berisi E )
Deklarasi
P : address
Deskripsi
Alokasi ( P ) { alokasi selau berhasil }
Info(P) ← E
{ insert sebagai elemen pertama }
Next(P) ← TOP(S)
TOP(S) ← P

Halaman 85
d. Penghapusan sebuah elemen pada
STACK (Pop)
Penghapusan elemen Stack selalu dilakukan pada
TOP , hanya saja harus diperhitungkan bahwa
mugkin Stack akan menjadi kosong akibat
terjadinya penghapusan. Jika Stack menjadi
kosong , maka harga TOP harus diganti . Realisasi
algoritma dari definisi funsional ini adalah salah
satu dari dua buah prosedur yang melakukan
pengambilan elemen stack sebagai berikut .
Prosedur pertama mengambil suatu Elmts dengan
menyimpan alamatnya dan yang kedua mengambil
nilai , dan membebaskan alamat ( dealokasi ) yang
tadinya dipakai
Halaman 86
procedure PopStack@(Input/Output S : STACK
Output P : address)
{K.Awal : Stack tidak kosong
K.Akhir : Alamat elemen Top (S) disimpan pada
P, sehingga informasinya dapat diakses
melalui P
Proses : Menghapus elemen stack, stack tidak boleh
kosong dan mungkin menjadi kosong }
Deklarasi
Deskripsi
P ← TOP (S)
TOP (S) ← Next(TOP(S))

Halaman 87
procedure PopStack(Input/Output S : STACK
Output E : InfoType)
{K.Awal : Stack tidak kosong
K.Akhir : Alamat elemen Top (S) disimpan pada
E, alamat TOP yang lama didealokasi
Proses : Menghapus elemen stack, stack tidak boleh
kosong dan mungkin menjadi kosong }
Deklarasi
P : address
Deskripsi
P ← TOP (S)
E ← Info(P)
TOP (S) ← Next(TOP(S))
Dealokasi (P)
Halaman 88
Soal-Soal Latihan
1. Mengapa cara penyusunan elemen pada
Stack sering disebut tersusun secara
LIFO?
2. Mengapa pada Stack Traversal dan Search
jarang dilakukan?
3. Penghapusan elemen pada Stack selalu
dilakukan pada elemen yang paling atas,
bagaimana jika terpaksa harus menghapus
elemen yang paling bawah?

Halaman 89
4. Buatlah sebuah fungsi untuk menghitung jumlah
elemen stack yang genap, jika diketahui sebuah
stack dengan elemen bertype integer.
5. Buatlah fungsi/prosedur untuk mencetak elemen
stack yang ganjil
6. Buatlah juga fungsi untuk menghitung rata-rata
elemen Stack yang genap
7. Buatlah sebuah fungsi untuk mengirimkan
elemen pertama Stack
8. Buatlah sebuah fungsi untuk mengirimkan
elemen Stack yang maksimum jika diketahui
elemen Stack terurut mengecil bertype integer
Halaman 90
Halaman 91
6. Queue (Antrian)
6.1. Definisi
Queue (Antrian) adalah list linier yang :
1. Dikenali elemen pertama (Head) dan elemen
terakhirnya (Tail)
2. Aturan penyisipan dan penghapusan elemennya
disefinisikan sebagai berikut :
- Penyisipan selalu dilakukan setelah elemen
terakhir
- Penghapusan selalu dilakukan pada elemen
pertama
3. Satu elemen dengan elemen lain dapat diakses
melalui informasi Next
Halaman 92
Struktur data ini banyak dipakai dalam
informatika misalnya untuk merepresentasi :
1. Antrian job dalam sistem operasi
2. Antrian dalam dunia nyata
Maka secara lojik, sebuah Queue dapat
digambarkan sebagai list linier yang setiap
elemennya adalah :
Type ElmtQ = record
<Info : InfoType,
Next : address >

Halaman 93
dengan InfoType terdefinisi yang menentukan
informasi yang disimpan pada setiap elemen
queue, dan address adalah “alamat” dari
elemen
Selain itu alamat elemen Pertama (Head) dan
elemen terakhir (Tail) dicatat.
Maka jika Q adalah Queue dan P adalah Address,
penulisan untuk Queue adalah :
Head(Q)
Tail(Q)
Next(P)
Info(P)
Halaman 94
Bagian Deklarasi dari algoritma pada Queue :
Deklarasi
type InfoType = … {Sebuah type terdefinisi}
type Address pointer to ElmtQ
type ElmtQ = record
<Info : InfoType,
Next : Address >
type Queue = record <Head : Address,
Tail : Address>
{Deklarasi Nama Peubah}
Q : Queue
P : Address

Halaman 95
6.2. Traversal pada Queue
Pada queue, jarang sekali dilakukan
traversal, karena keunikan Queue justru
pada operasi yang hanya menyangkut
elemen pertama dan terakhir. Namun
dibutuhkan traversal misalnya untuk
mencetak isi Antrian.
6.3. Search pada Queue
Pada Queue, elemen yang diproses hanyalah
elemen pada pertama dan terakhir. Maka
hampir tidak pernah dilakukan search.
Halaman 96
6.4. Operasi dan fungsi dasar
pada Queue.
a. Test Queue kosong
Mengetahui bahwa Queue kosong atau tidak
sangat penting, sebab semua operasi akan
dilakukan berdasarkan kosong atau tidaknya
suatu Queue. Realisasi algoritma dari definisi
fungsional ini adalah sebuah fungsi yang
melakukan test terhadap Queue sebagai
berikut :

Halaman 97
function IsQEmpty (Q : Queue) → Boolean
{ TEST Queue kosong : Mengirim true, jika
antrian kosong, false jika antrian tidak
kosong}

Deklarasi
Deskripsi
return ((Head(Q) = Nil) and (Tail(Q) = Nil))

Halaman 98
b. Pembuatan Queue kosong
Membuat Queue kosong diperlukan untuk memulai
memakai Queue. Realisasi algoritma dari definisi
fungsional ini adalah sebuah prosedur yang
melakukan inisialisasi Queue sebagai berikut :

Procedure CreateEmptyQ (Output Q : Queue)


{K. Awal : sembarang,
K. Akhir : sebuah queue Q yang kosong terbentuk
Proses : Membuat queue kosong }

Deklarasi
Deskripsi
Head(Q) ← Nil
Tail(Q) ← Nil

Halaman 99
c.Penambahan sebuah elemen pada
Queue
Penambahan selalu dilakukan pada ekor,
dan karena alamat ekor diketahui maka
prosesnya sederhana, yaitu hanya
InsertLast.

Berikut ini akan diberikan skema prosedur


penyisipan tersebut.

Halaman 100
Realisasi algoritma dari definisi fungsional ini
adalah salah satu dari dua buah prosedur
yang melakukan penambahan elemen
Queue sebagai berikut :

Prosedur pertama menambahkan suatu


Elemen Queue yang diketahui alamatnya
dan yang kedua menambahkan suatu nilai
Elemen queue yang diberikan.

Halaman 101
procedure InsertQ@ (Input/Output Q : Queue
Input P : address)
{K.Awal : Queue mungkin kosong, P terdefinisi
(berarti terdefinisi informasinya, Next
(P) = Nil
K.Akhir : P menjadi elemen Tail dari Q dan
Tail yang baru adalah P
Proses : Insert sebuah elemen beralamat P
pada Tail dari antrian Q }

Deklarasi

Halaman 102
Deskripsi
If IsQEmpty(Q) then
Head(Q) ← P
Tail(Q) ← P
else
Next(Tail(Q)) ← P
Tail(Q) ← P
endif

Halaman 103
procedure InsertQ(Input/Output Q : Queue
Input E : InfoType)
{K.Awal : Queue mungkin kosong, E
terdefinisi
K.Akhir : Elemen Tail dari Q yang baru
bernilai E
Proses : Insert sebuah elemen nilai pada
Tail dari antrian Q }
Deklarasi
Halaman 104
Deskripsi
Alokasi (P)
Info (P) ← E
If IsQEmpty(Q) then
Head(Q) ← P
Tail(Q) ← P
else
Next(Tail(Q)) ← P
Tail(Q) ← P
endif

Halaman 105
d. Penghapusan Elemen Pada QueuE
Penghapusan elemen pada queue selalu
dilakukan pada elemen pertama, hanya saja
perlu diperhitungkan bahwa mungkin queue
menjadi kosong akibat terjadinya
penghapusan. Jika queue menjadi kosong,
maka harga Tail harus diganti. Jika akibat
penghapusan queue tidak kosong, maka
elemen terakhir tidak berubah.

Halaman 106
Berikut adalah skema penghapusan tersebut.
Prosedur pertama melakukan penghapusan
ElmtQ yang berada di Head danyang dicatat
adalah alamatnya, yaitu P. Prosedur yang
kedua menghapus elemen Head dari queue dan
menyimpannya pada suatu elmtQ serta
membebaskan alamat yang tadinya dipakai
oleh elemen Head tersebut.

Halaman 107
procedure DeleteQ@(Input/Output Q : Queue
Output P : address)
{K.Awal : Queue tidak kosong
K.Akhir : P bukan lagi elemen dari Q, P ≠ Nil,
Next(P) = Nil
Proses : Menghapus elemen Head dari antrian,
antrian tidak boleh kosong dan
mungkin menjadi kosong }
Deklarasi
Deskripsi

Halaman 108
P ← Head(Q)
Head(Q) ← Next(Head(Q))
if (Head(Q) = Nil) then
Tail(Q) ← Nil
endif
Next(P) ← Nil

Halaman 109
procedure DeleteQ(Input/Output Q : Queue
Output E : InfoType)
{K.Awal : Queue tidak kosong
K.Akhir : Jika P adalah Head(Q). P bukan lagi
elemen dari Q, P ≠ Nil,
Next(P) = Nil
Proses : Menghapus elemen Head dari antrian,
antrian tidak boleh kosong dan
mungkin menjadi kosong }
Deklarasi
Deskripsi
Halaman 110
P ← Head(Q)
E ← Info(Head(Q))
Head(Q) ← Next(Head(Q))
if (Head(Q) = Nil) then
Tail(Q) ← Nil
endif
Next(P) ← Nil
Dealokasi(P)
Halaman 111
Soal-Soal
1. Mengapa cara penyusunan elemen pada
Queue Sering disebut tersusun secara
FIFO?
2. Mengapa pada Queue Traversal dan
Search jarang dilakukan?
3. Penghapusan elemen pada Queue selalu
dilakukan pada elemen yang paling depan,
bagaimana jika terpaksa harus menghapus
elemen yang paling belakang?
Halaman 112
4. Buatlah sebuah fungsi untuk menghitung jumlah
elemen queue yang ganjil, jika diketahui sebuah
queue dengan elemen bertype integer.
5. Buatlah fungsi/prosedur untuk mencetak elemen
queue yang genep
6. Buatlah juga fungsi untuk menghitung rata-rata
elemen queue yang ganjil
7. Buatlah sebuah fungsi untuk mengirimkan elemen
pertama queue
8. Buatlah sebuah fungsi untuk mengirimkan elemen
queue yang maksimum jika diketahui elemen queue
terurut membesar dan bertype integer
Halaman 113
Halaman 114
7. Pohon (Tree)
7.1. Definisi Rekurens Dari Pohon
Sebuah pohon adalah himpunan terbatas tidak
kosong, dengan elemen yang dibedakan
sebagai berikut :
1. Sebuah elemen yang dibedakan dari yang
lain yang disebut sebagai AKAR (root) dari
pohon
2. Elemen yang lain (jika masih ada) dibagi-
bagi menjadi beberapa sub himpunan yang
disjoint dan masing-masing sub himpunan
tersebut adalah pohon yang disebut sebagai
sub pohon dari pohon tersebut.
Halaman 115
Beberapa Istilah
1. Hutan
Hutan adalah sequence (list) dari pohon
2. Simpul (Node)
Simpul adalah elemen dari pohon yang
memungkinkan akses pada sub pohon dimana
simpul tersebut berfungsi sebagai Akar
3. Cabang
Cabang adalah hubungan antara Akar dengan
sub pohon

Halaman 116
4. Ayah
Akar dari sebuah pohon adalah Ayah dari
sub pohon
5. Anak
Anak dari sebuah pohon adalah Sub pohon
6. Saudara
Saudara adalah simpul-simpul yang
mempunyai Ayah yang sama
7. Daun
Daun adalah simpul terminal dari pohon.
Semua simpul selain Daun adalah simpul
bukan terminal

Halaman 117
8. Jalan (Path)
Jalan adalah suatu urutan tertentu dari
Cabang
9. Derajat
Derajat sebuah pohon adalah banyaknya
anak dari dari pohon tersebut.
Jika sebuah simpul berderajat N disebut
pohon N-aire
1 disebut pohon 1-aire/uner
2 disebut pohon 2-aire/biner
Halaman 118
10. Tingkat (Level)
Level pohon adalah panjangnya jalan dari
Akar sampai dengan simpul yang
bersangkutan. Panjang dari jalan adalah
banyaknya simpul yang dikandung pada
jalan tersebut. Akar mempunyai tingkat sama
dengan 1.

Dua buah simpul disebut sebagai Sepupu jika


mempunyai tingkat yang sama dalam sebuah
pohon.
Halaman 119
11. Kedalaman (Tinggi)
Kedalaman (Tinggi) dari pohon adalah nilai
maksimum dari tingkat simpul yang ada pada
pohon tersebut. Kedalaman adalah panjang
maksimum jalan dari Akar menuju ke sebuah
daun

12. Lebar
Lebar sebuah Pohon adalah maksimum
banyaknya simpul yang ada pada suatu
Tingkat (Level)

Halaman 120
7.2. Struktur Pohon Biner
Definisi
Sebuah pohon biner (Binary Tree) adalah
himpunan terbatas yang :
¾ Mungkin kosong atau
¾ Terdiri dari sebuah simpul yang disebut
sebagai Akar dan dua buah himpunan lain
yang disjoint yang merupakan pohon biner
yang disebut sebagai Sub Pohon Kiri (Left)
dan Sub Pohon Kanan (Right) dari pohon biner
tersebut.

Halaman 121
Pohon biner merupakan tipe yang sangat penting
dari struktur data dan banyak dijumpai
dalam berbagai terapan. Karakteristik yang
dimiliki oleh pohon biner adalah bahwa
setiap simpul paling banyak hanya
memiliki dua buah anak, dan mungkin
tidak punya anak.

Istilah-istilah yang digunakan sama dengan


istilah pada pohon secara umum.

Halaman 122
Notasi Prefiks, Infiks dan Postfiks
1. Notasi Prefiks
Notasi Prefiks ditulis dengan cara mengikuti
alur sebagai berikut :

Halaman 123
2. Notasi Infiks
Notasi ini ditulis dengan cara mengikuti alur
sebagai berikut :

Halaman 124
3. Notasi Posfiks
Notasi ini ditulis dengan cara mengikuti alur
sebagai berikut :

Halaman 125
Rekonstruksi Algoritma
{Deklarasi Type}
Type Infotype = … {terdefinisi}
Type node = record <Info : infotype,
Left : address,
Right: address >
Type BinTree : address

{Primitif}

Halaman 126
function Akar (P : BinTree)→ infotype
{Mengirimkan nilai Akar pohon biner P}

function Left (P : BinTree)→ infotype


{Mengirimkan anak kiri pohon biner P}

function Right (P : BinTree)→ infotype


{Mengirimkan anak kanan pohon biner P}

Halaman 127
function IsEmpty(P : BinTree)→boolean
{ Test apakah sebuah pohon kosong,
mengirimkan True jika kosong dan False jika
tidak}

procedure MakeTree(input Akar : infotype, L :


BinTree, R : BinTree, output P : BinTree)
{ K. Awal : sembarang
K. Akhir : Terbentuk sebuah pohon biner
Proses : Menghasilkan sebuah pohon biner
dari Akar, L dan R}

Halaman 128
{Traversal}
Procedur PreOrder(input P : BinTree)
{K. AWAL : P terdefinisi
K. AKHIR : Semua simpul P sudah
diproses secara preorder}

Procedure InOrder(input P : BinTree)


{K. AWAL : P terdefinisi
K. AKHIR : Semua simpul P sudah
diproses secara inorder}
Halaman 129
Procedure PostOrder(input P : BinTree)
{K. AWAL : P terdefinisi
K. AKHIR : Semua simpul P sudah
diproses secara postorder}

Procedure PrintTree(input P : BinTree, h : integer)


{K. AWAL : P terdefinisi, h adalah jarak indentasi
K. AKHIR : Semua simpul P sudah ditulis dengan
indentasi}

Halaman 130
{Search}
function Search(P : BinTree, X : infotype)→boolean
{Mengirimkan True jika ada node P bernilai X, false
jika tidak}

{fungsi lain}
function NbElmt(P : BinTree)→integer
{Mengirimkan banyaknya elemen (node) pohon
biner P}

Halaman 131
function NbDaun(P : BinTree) →integer
{ Mengirimkan banyaknya daun pohon biner P}
function IsUnerLeft(P : BinTree) →boolean
{ Mengirimkan True jika pohon biner tidak
kosong P adalah pohon unerleft yaitu hanya
mempunyai sub pohon kiri}
function IsUnerRight(P : BinTree) →boolean
{ Mengirimkan True jika pohon biner tidak
kosong P adalah pohon unerright yaitu hanya
mempunyai sub pohon kanan}

Halaman 132
function IsBin(P : BinTree)→boolean
{ Mengirimkan True jika pohon biner tidak
kosong P adalah pohon biner yaitu mempunyai
sub pohon kanan dan sub pohon kiri}

function IsSkewLeft(P : BinTree)→boolean


{ Mengirimkan True jika pohon biner P adalah
pohon condong kiri}

function IsSkewRight(P : BinTree)→boolean


{ Mengirimkan True jika pohon biner P adalah
pohon condong kanan}

Halaman 133
function Tinggi(P : BinTree)→integer
{ Mengirimkan tinggi dari pohon biner P}

function Level(P : BinTree, X : infotype)→integer


{ Mengirimkan level dari node X yang merupakan
salah satu simpul dari pohon biner P}

{Operasi Lain}

Halaman 134
Procedure AddDaunTerkiri(input/output P:BinTree,
input X: infotype)
{K. AWAL : P boleh kosong
K. AKHIR : P bertambah simpulnya, dengan X
adalah simpul daun terkiri}
Procedure AddDaun(input/output P:BinTree, input
X, Y : infotype, input Kiri : boolean)
{K. AWAL : P tidak boleh kosong, X adalah salah
satu daun pohon Biner P
K. AKHIR : P bertambah simpulnya, dengan Y
adalah anak kiri X (jika kiri) atau
sebagai anak kanan X (jika not kiri)}
Halaman 135
Procedure DelDaunTerkiri(input/output
P:BinTree, output X: infotype)
{K. AWAL : P tidak kosong
K. AKHIR: P dihapus daun terkirinya dan
didealokasi, dengan X adalah info
yang semula disimpan pada daun
terkiri yang dihapus}
Procedure DelDaun(input/output P:BinTree,
output X: infotype)
{K. AWAL : P tidak kosong, X adalah salah satu
daun
K. AKHIR : X dihapus dari P}
Halaman 136

You might also like