Anda di halaman 1dari 217

Pertemuan 1

STRUKTUR DATA

Struktur Data adalah : suatu koleksi atau kelompok data


yang dapat dikarakteristikan oleh organisasi serta operasi
yang didefinisikan terhadapnya.

Pemakaian Struktur Data yang tepat didalam proses


pemrograman, akan menghasilkan Algoritma yang lebih
jelas dan tepat sehingga menjadikan program secara
keseluruhan lebih sederhana.
Konsep Dasar Tipe Data
Pada garis besarnya, Data dapat dikategorikan menjadi :
A. Type Data Sederhana / Data Sederhana
Terdiri dari :
1. Data Sederhana Tunggal
Misalnya : Integer, Real/Float, Boolean dan
Character
2. Data Sederhana Majemuk
Misalnya : String

B. Struktur Data
Terdiri dari :
1. Struktur Data Sederhana
Misalnya Array dan Record
Konsep Dasar Tipe Data

2. Struktur Data Majemuk


Terdiri dari :
a. Linier
Misalnya : Stack, Queue dan Linear Linked List.

b. Non Linier
Misalnya : Pohon (Tree), Pohon Biner (Binary
Tree), Pohon Cari Biner (Binary Search Tree),
General Tree serta Graph.
TYPE DATA SEDERHANA
(Dalam Program C++)

1. INTEGER
Merupakan Bilangan Bulat dan tidak mengandung
pecahan. seperti : ...-3,-2,-1,0,1,2,3,....

Type data Integer


Type Range Ukuran
(Byte)
Integer - 32768..32767 2
Long - 2147483648..2147483647 4
TYPE DATA SEDERHANA
(Dalam Program C++)
2. FLOAT
Type data yang merupakan bilangan pecahan.
Jenis Data float ditulis dgn menggunakan
titik(koma) desimal.
Misalnya : 0.32 4,35 -131.128

Type Real dapat juga ditulis dengan Rumus :

M * Re = X

M = Pecahan, R = Radix,
e = Exponen, X = Hasil Bilangan,

Misalnya : 3.2 * 10-1 = 0.32


4.35 * 102 = 435
TYPE DATA SEDERHANA
(Dalam Program C++)

Type data FLOAT

Type Range Ukuran


(Byte)
Float 3.4 x 10 -38 s/d 3.4 x10 +38 4
Double 1.7 x 10 -308 s/d 1.7x10 +308 8
Long Double 3.4 x 10 -4932 s/d 1.1x10 + 4932 10
TYPE DATA SEDERHANA
(Dalam Program C++)

3. BOOL ATAU LOGICAL


Type data yang hanya mempunyai dua bentuk keluaran
yaitu nilai True dan False (Benar dan Salah) yang
dinyatakan dengan 1 dan 0, Sehingga satuan data yang
terpakai cukup satu bit saja. Operator yang digunakan
adalah : And, Or dan Not.
TYPE DATA SEDERHANA
(Dalam Program C++)

Input NOT (!) AND (&&) OR (||)


A B C !A !B !C A&&B&&C A||B||C
0 0 0 1 1 1 0 0
0 0 1 1 1 0 0 1
0 1 0 1 0 1 0 1
0 1 1 1 0 0 0 1
1 0 0 0 1 1 0 1
1 0 1 0 1 0 0 1
1 1 0 0 0 1 0 1
1 1 1 0 0 0 1 1
TYPE DATA SEDERHANA
(Dalam Program C++)
4. CHARACTER
Type data yang terdiri dari aksara (simbol) yang
meliputi digit numerik, character alfabetik dan spesial
character. Untuk menuliskan tipe char, karakter perlu
ditulis di dalam tanda petik tunggal ( ‘ )
Contoh :
‘A’ karakter berupa huruf A
‘1’ karakter berupa angka 1
‘*’ karakter simbol *
TYPE DATA SEDERHANA
(Dalam Program C++)
5. STRING
Merupakan type data majemuk yang terbentuk dari
kumpulan character sebanyak 256 (default) dengan
jangkauan niai 0 - 255. Kumpulan character yang
digunakan untuk membentuk String dinamakan
alfabet. Pemberian nilai String diapit dengan tanda
petik ganda (“)

Bentuk umum penulisan tipe data ini adalah :


tipe_data pengenal [panjang] ;
pengenal = nama variabel
panjang = bilangan bulat yg menunjukan jumlah
karakter

Contoh : char nama[15] ;


TYPE DATA SEDERHANA
(Dalam Program C++)
Fungsi pada Operasi STRING
1. Strcpy()
untuk menyalin nilai string.
2. Strcat()
untuk menggabungkan nilai string.
3. Strcmp()
untuk membandingkan 2 nilai string.
4. Strlen()
untuk mengetahui panjang nilai string.
5. Strchr ()
untuk mencari nilai karakter dalam string.
Diharapkan dosen memberikan contoh
aplikasi programnya
TYPE DATA SEDERHANA
(Dalam Program C++)
Diharapkan dosen memberikan latihan dan contoh program
serta memberikan tugas kelompok kepada mahasiswa untuk
membuat program yang menggunakan salah satu operator
dibawah ini (dikumpulkan pada pertemuan berikutnya)
Jenis-jenis Operator Dalam Bahasa C++
Operator Keterangan
Aritmatika
pow Pangkat
sqrt Menghitung akar
% Sisa hasil bagi (modulus)
* , / Perkalian, Pembagian
+ , - Penjumlahan, Pengurangan
TYPE DATA SEDERHANA
(Dalam Program C++)
Operator Pemberi Nilai Keterangan
Aritmatika
*= Perkalian
/= Pembagian
%= Sisa hasil bagi
+= Penjumlahan
-= Pengurangan

Operator Keterangan
Logika
&& Dan (AND)
|| Atau (OR)
! Bukan (NOT)
TYPE DATA SEDERHANA
(Dalam Program C++)
Operator Unary Keterangan
+ Tanda Plus
- Tanda Minus

Operator Penambah Keterangan


& Pengurang
++ Penambahan
-- Pengurangan
TYPE DATA SEDERHANA
(Dalam Program C++)

Operator Keterangan
Relasi
= Sama dengan (assignment)
!= Tidak sama dengan
> Lebih besar
< Lebih kecil
== Sama dengan (bukan assignment)
>= Lebih besar atau sama dengan
<= Lebih kecil atau sama dengan
TYPE DATA SEDERHANA
(Dalam Program C++)

Operator Keterangan
Bitwise
~ NOT
<< Shift Left
>> Shift Right
& AND
^ XOR
| OR
TYPE TERSTRUKTUR
(Dalam Program C++)

Bermanfaat untuk mengelompokkan sejumlah data


dengan tipe data yang berlainan.
Contoh :
struct data_pegawai
{
int nip;
char nama[25];
char alamat[40];
}
Pertemuan 2

ARRAY
DIMENSI 1 & 2
Definisi Array
Array / Larik : Struktur Data Sederhana yang dapat
didefinisikan sebagai pemesanan alokasi memory
sementara pada komputer.

Array dapat didefinisikan sebagai suatu himpunan hingga


elemen yang terurut dan homogen.

Terurut : Dapat diartikan bahwa elemen tersebut dapat


diidentifikasi sebagai elemen pertama, elemen kedua dan
seterusnya sampai elemen ke-n.

Homogen : Adalah bahwa setiap elemen dari sebuah


Array tertentu haruslah mempunyai type data yang sama.
Definisi Array
Sebuah Array dapat mempunyai elemen yang seluruhnya
berupa integer atau character atau String bahkan dapat
pula terjadi suatu Array mempunyai elemen berupa Array.

Karakteristik Array :
1. Mempunyai batasan dari pemesanan alokasi memory
(Bersifat Statis)
2. Mempunyai Type Data Sama (Bersifat Homogen)
3. Dapat Diakses Secara Acak
Definisi Array

3 Hal yang harus diketahui dalam mendeklarasikan


array :
a. Type data array
b. Nama variabel array
c. Subskrip / index array

Jenis Array (yang akan dipelajari) adalah :


a. Array Dimensi Satu (One Dimensional Array)
b. Array Dimensi Dua (Two Dimensional Array)
c. Array Dimensi Tiga (Thee Dimensional Array)
Array Dimensi Satu

1.ARRAY DIMENSI SATU (One Dimensional Array)

Dapat disebut juga dengan istilah vektor yang


menggambarkan data dalam suatu urutan
Deklarasi : Type_Data Nama_Variabel [index]
Misalnya : int A[5];

Penggambaran secara Logika :


Elemen Array

A[1] A[2] A[3] A[4] A[5]


0 1 2 3 4

Subscript / Index
void main()
{ int bil [5]; Array Dimensi Satu
clrscr;
cout<<"Masukkan 5 bilangan genap : "<<endl;
for (int i = 0; i < 5; i++)
{ cout<<"Bilangan ";
cout<< i + 1 <<" : ";
cin>> bil[i];
cout<<endl;
}
cout<<endl;
cout<<"5 bilangan genap yang dimasukkan “ <<endl;
for (int i = 0; i < 5; i++)
cout<<" "<<bil[i];
getch();
}
Array Dimensi Satu
Rumus untuk menentukan jumlah elemen dalam Array :

n
π = Perkalian dari elemen sebelumnya
π (Elemen Array) (untuk array dimensi dua & tiga)
i=1

Contoh :
Suatu Array A dideklarasikan sbb :
int A[10]; maka jumlah elemen Array dimensi satu tersebut
adalah = 10
PEMETAAN (MAPPING)
ARRAY DIMENSI SATU KE STORAGE

Rumus : @A[i] = B + (i – 1) * L

Dimana : @A[i] : Posisi Array yg dicari


B : Posisi awal index di memory komputer
i : Subkrip atau indeks array yg dicari
L : Ukuran / Besar memory suatu type data
Contoh :
Suatu Array A dideklarasikan sebagai berikut :
int A[5]; dengan alamat awal index berada di 0011 (H) dan
ukuran memory type data integer = 2
Tentukan berapa alamat array A[3] ?
PEMETAAN (MAPPING)
ARRAY DIMENSI SATU KE STORAGE

Rumus : @A[i] = B + (i – 1) * L
Diketahui : Penyelesaian :
@A[i] = A[3] A[3] = 0011(H) + (3 – 1) * 2
B = 0011 (H) = 0011(H) + 4 (D)
i = 3 = 0011(H) + 4 (H)
L = 2
= 0015(H) 4 Desimal = 4 Hexa

0 1 2 3 4
A[1] A[2] A[3] A[4] A[5]
0011 0013 0015 0017 0019
KONVERSI BILANGAN
1. Decimal adalah bilangan berbasis sepuluh yang
terdiridari 0, 1, 2, 3, 4, 5, 6, 7, 8, dan 9
2. Hexadecimal adalah bilangan berbasis enam belas yang
terdiri dari 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, dan F

Tabel di bawah adalah contoh konversi bilangan Decimal,


dan Hexadecimal
Contoh KONVERSI ANTAR BILANGAN

Konversi Bilangan Decimal ke Hexadecimal


Contoh 254 (10) = .......(16)

Caranya dengan membagi bilangan tersebut dengan enam belas


sampai bilangan tersebut tidak bisa lagi dibagi enam belas (kurang
dari enam belas) dengan mencatat setiap sisa pembagian.

254 : 16 = 15 sisa 14 atau E (lihat tabel di atas)


15 : 16 = sisa 15 atau F (lihat tabel di atas)

Jadi 254 (10) = FE (16) diurutkan dari sisa pembagian terakhir.


Contoh Penerapan
Array Dimensi 1 Pada Program C++

0 1 2 3 4 5 6 7
indeks

value

alamat
21d2 21d4 21d6 21d8 21da 21dc 21de 21e0

%x adalah hexadesimal
Array Dimensi Dua
2. ARRAY DIMENSI DUA (Two Dimensional Array)
Sering digunakan dalam menterjemahkan matriks
pada pemrograman.

Deklarasi : Type_Data Nama_Variabel [Index1] [index2];


Misal : int A[3][2];

Penggambaran secara Logika : 0 1


0
1
2
Array Dimensi Dua
Menentukan jumlah elemen dalam Array dimensi dua:

n
π = Perkalian dari elemen sebelumnya
π (Elemen array) (untuk array dimensi dua & tiga)
i=1

Contoh :
Suatu Array X dideklarasikan sbb :
int X[4][3];
maka jumlah elemen Array dimensi dua tersebut adalah :

(4) * (3) = 12
PEMETAAN (MAPPING)
ARRAY DIMENSI DUA KE STORAGE

Terbagi Dua cara pandang (representasi) yang berbeda :


1. Secara Kolom Per Kolom (Coloumn Major Order/CMO)

@M[i][j] = M[0][0] + {(j - 1) * K + (i - 1)} * L

2. Secara Baris Per Baris (Row Major Order / RMO)

@M[i][j] = M[0][0] + {(i - 1) * N + (j - 1)} * L

Keterangan :
@M[i][j] = Posisi Array yg dicari, M[0][0] = Posisi alamat awal index
array,i = Baris, j = kolom, L = Ukuran memory type data
K = Banyaknya elemen per kolom, N = Banyaknya elemen per baris
Penggambaran secara logika
0 1
Misal : int M[3][2];
0
(Array dengan 3 Baris & 2 Kolom)
1
2
Berdasarkan Cara pandang :
1. Kolom Per Baris (Row Major Order / RMO)
M[0,0] M[0,1] M[1,0] M[1,1] M[2,0] M[2,1]
Jumlah elemen per baris = 2

2. Baris Per Kolom (Coloumn Major Order / CMO)


M[0,0] M[1,0] M[2,0] M[0,1] M[1,1] M[2,1]

Jumlah elemen per kolom = 3


Contoh Pemetaan :

Suatu Array X dideklarasikan sebagai berikut :


Float X[4][3], dengan alamat index X[0][0] berada
di 0011(H) dan ukuran type data float = 4

Tentukan berapa alamat array X[3][2]


berdasarkan cara pandang baris dan kolom ?
0 1 2 index

0 0011(H)
1
2
?
3

index
Lanjutan Contoh Pemetaan :

Penyelesaian :

Secara Baris Per Baris (Row Major Oder / RMO)


@M[i][j] = @M[0][0] + {(i - 1) * N + (j - 1)} * L
X[3][2] = 0011(H) + {(3 – 1) * 3 + (2 – 1)} * 4
= 0011(H) + 28 (D) 1C (H)
= 0011(H) + 1C (H)

= 002D(H)
Lanjutan Contoh Pemetaan :

Penyelesaian :

Secara Kolom Per Kolom (Coloumn Major Oder / CMO)


@M[i][j] = @M[0][0] + {(j - 1) * K + (i - 1)} * L
X[3][2] = 0011(H) + {(2 – 1) * 4 + (3 – 1)} * 4
= 0011(H) + 24 (D) 18 (H)
= 0011(H) + 18 (H)

= 0029(H)
Contoh program array dua dimensi

#include<stdio.h>
#include<conio.h>
main()
{
int a[3][5];
for (int i=0;i<3;i++)
{
for (int j=0;j<5;j++)
{
printf("%x ",&a[j][i]);
}
printf("\n");
}
getch();
}
Contoh program array dua dimensi

#include<stdio.h>
#include<conio.h>
main()
{
int a[3][5];
for (int i=0;i<3;i++)
{
for (int j=0;j<5;j++)
{
printf("%x ",&a[i][j]);
}
printf("\n");
}
getch();
}
Latihan :

1. Suatu array A dideklarasikan sbb :


int A[50] dengan alamat awal berada di
0011(H). Tentukan berapa alamat array A[20]
dan A[40]?

2. Suatu array X dideklarasikan sbb :


Float X[4][5] dengan alamat awal berada pada
0011(H). Tentukan berapa alamat array X[4][3],
berdasarkan cara pandang baris dan kolom?
Pertemuan 3
ARRAY
DIMENSI BANYAK
3. ARRAY DIMENSI TIGA (Three Dimensional Array)

Digunakan untuk mengelola data dalam bentuk 3


dimensi atau tiga sisi.
Deklarasi :
Type_Data Nama_Variabel [index1] [ndex2] [index3];
Misal : int A [3][4][2];

Penggambaran secara Logika :

1
1
2
0
0 1 2 3
Menentukan jumlah elemen dalam Array dimensi 3 :

n
π (index array) π = Perkalian dari statemen sebelumnya
i=1

Contoh :
Suatu Array X dideklarasikan sbb :
int A [3][4][2]; maka jumlah elemen Array dimensi tiga
tersebut adalah :

(3) * (4) * (2) = 24


PEMETAAN (MAPPING)
ARRAY DIMENSI TIGA KE STORAGE

Rumus :
@M[m][n][p] = M[0][0][0] + {((m-1) *(jum.elemen2 *
jum.elemen3)) + ((n-1)*(jum.elemen 3)) +
((p-1)}* L

Contoh :
Suatu Array A dideklarasikan sebagai berikut :
int A [2][4][3], dengan alamat awal index A[0][0][0] berada di
0011(H) dan ukuran type data int = 2 Tentukan berapa
alamat array di A[2][3][2] ?
Contoh Pemetaan :
Penyelesaian :
1. Tentukan jumlah elemen array A [2][4][3]
= (2) * (4) * (3) = 24

2. @M[m][n][p] = M[0][0][0] + {((m-1) *(jum.elemen2 *


jum.elemen3)) + ((n-1)*(jum.elemen
3)) + ((p-1)}* L

A[2][3][2] = 0011(H) + {((2–1) * 4 * 3) + ((3-1) * 3) +


(2-1)} * 2
= 0011(H) + {12 + 6 + 1 } * 2
= 0011(H) + 38 (D) 26 (H)
= 0011(H) + 26 (H)
= 0037(H)
Contoh mengenal alamat array dimensi tiga
1. Terdapat array tiga dimensi dengan int A[3][5][2].
Diketahui &A[0][0][0]=1000H, Ditanya &A[2][3][1]=....?
Tipe int satu elemen=2byte
Untuk array [2][3][1]: 1 baris=5 elemen
: 1 grup=3 * 5=15 elemen
&A[0][0][0]=1000H
&A[0][0][0]
0 1 2 3 4
Pindah grup=1-0=1 grup
G 0
=1*15=15 elemen
R
U 1 Pindah baris dalam grup terakhir
P =2-0=2baris
0 2 =2*5=10 elemen
0 1 2 3 4 Pindah kolom dalam baris terakhir
G 0 =3-0=3 elemen
R Total perpindahan=15+10+3=28 elemen
U 1 =28 elemen* 2 byte=56 byte, 56D=38H
P Jadi,&A[1][2][3]=1000H+0038H=1038H
1 2
&A[2][3][1]=...?
2. Terdapat array tiga dimensi dengan int A[3][5][2].
Diketahui &A[1][4][1]=12EFH, Ditanya &A[0][2][0]=....?
Tipe int satu elemen=2byte
Untuk array [3][5][2]: 1 baris=5 elemen
: 1 grup=3 * 5=15 elemen
&A[1][4][1]
&A[0][2][0]=...? Pindah grup=0-1=-1 grup
0 1 2 3 4 =-1*15=-15 elemen
(mundur)
G 0
Pindah baris dalam grup terakhir
R
=0-1=-1 baris
U 1
=-1 baris*5=-5 elemen
P
0 2
Pindah kolom dalam baris terakhir
0 1 2 3 4 =2-4=-2 elemen
G 0
R Total perpindahan=-15+-5+-2=-22 elemen
U 1 =-22 elemen* 2 byte=-44 byte, -44D=-2CH
P Jadi,&A[0]0][2]=12EFH-002CH=12C3H
1 2
&A[1][4][1]=12EFH
Contoh Program array dimensi 3
/*
*Judul Program : Array dimensi 3
*Bahasa Program : Bahasa C
*Pembuat Program : Hendro Pramana
Sinaga printf("Liga Champions : \n\n");
*Tanggal Pembuatan : 5 Mei 2012
*/ for(i=0; i<5; i++)
{
#include <stdio.h> ++h;
#include <conio.h> printf("Grup %c \n", h);

for(s=0; s<4; s++)


main() {
{ printf(" %d. %s \n",
char h=64, nama[5][4][22] = { s+1, nama[i][s]);
"AC }
Milan","Barcelona","Porto","Monaco", printf("\n");
"Liverpool","Real Madrid","CSK }
Moskow","PSG",
"Inter
Milan","Arsenal","Atletico getch();
Madrid","Ajax",
"AS Roma","Manchester }
United","Dortmund","Valencia",
"Manchester City","Bayern
Munich","Napoli","Vilareal"

};
Tampilan Program
TRINGULAR ARRAY
(ARRAY SEGITIGA)
Tringular Array dapat merupakan Upper Tringular
(seluruh elemen di bawah diagonal utama = 0),
ataupun Lower Tringular (seluruh elemen di atas
diagonal utama = 0).

Dalam Array Lower Tringular dengan N baris, jumlah


maksimum elemen <> 0 pada baris ke-I adalah = I,
karenanya total elemen <> 0, tidak lebih dari

N
Σ I = N(N+1) / 2
I=1
Gambar (a) Upper Triangular Array
(b) Lower Triangular Array
Contoh :
Diketahui suatu array segitiga atas memiliki 3 baris dan
kolom, tentukan berapakah jumlah elemen yang bukan
nol pada array tersebut.
I = N(N+1) / 2
I = 3 (3+1) / 2
= 12 / 2
=6

Contoh bentuk array nya adalah seperti dibawah ini :


10 20 30 5 10 15
0 40 50 0 20 25 Dan lain-lain

0 0 60 0 0 30
Suatu Array Upper Tringular dan Array Lower
Tringular dapat dengan order yang sama, dapat
disimpan sebagai suatu array dengan order yang
berbeda, Contohnya :
SPARSE ARRAY (ARRAY JARANG)
Suatu Array yang sangat banyak elemen nol-nya,
contohnya adalah Array A pada Gambar berikut :
Pertemuan 4
KONSEP POINTER DAN LINKED LIST
Untuk mengolah data yang banyaknya tidak bisa
ditentukan sebelumnya, maka disediakan satu fasilitas
yang memungkinan untuk menggunakan suatu perubah
yang disebut dengan perubah dinamis (Dinamic variable)

Perubah Dinamis (Dinamic variable)


Suatu perubah yang akan dialokasikan hanya pada saat
diperlukan, yaitu setelah program dieksekusi.
Perbedaan Perubah Statis & Dinamis
Pada perubah statis, isi Memory pada lokasi tertentu
(nilai perubah) adalah data sesungguhnya yang akan
diolah. Pada perubah dinamis, nilai perubah adalah
alamat lokasi lain yang menyimpan data sesungguhnya.
Dengan demikian data yang sesungguhnya dapat
dimasukkan secara langsung.
Dalam hal cara pemasukkan data dapat diilustrasikan
seperti dibawah ini.
DEKLARASI POINTER

Pointer digunakan sebagai penunjuk ke suatu alamat


memori
Dalam pemrograman C++, Type Data Pointer
dideklarasikan dengan bentuk umum :

Type Data * Nama Variabel;

Type Data dapat berupa sembarang type data, misalnya


char, int atau float. Sedangkan Nama veriabel merupakan
nama variabel pointer
Contoh penggunaan pointer dalam program C++:

Void main()
{
int x,y,*z;
x = 75; //nilai x = 75
y = x; //nilai y diambil dari nilai x
z = &x; //nilai z menunjuk kealamat pointer dari nilai
x
getch();
}
LINKED LIST (LINKED LIST)

Salah satu Struktur Data Dinamis yang paling


sederhana adalah Linked List atau Struktur Berkait
atau Senarai Berantai, yaitu suatu kumpulan komponen
yang disusun secara berurutan dengan bantuan
Pointer.
Linked List (Senarai Berantai) disebut juga dengan
Senarai Satu Arah (One-Way List). Masing-masing
komponen dinamakan dengan Simpul (Node).
Perbedaan Karakteristik
Array dan Linked List
Setiap simpul dalam suatu Linked List terbagi menjadi dua
bagian,yaitu :

1. Medan Informasi
Berisi informasi yang akan disimpan dan diolah.

2. Medan Penyambung (Link Field)


Berisi alamat berikutnya. Bernilai 0, Jika Link tersebut
tidak menunjuk ke Data (Simpul) lainnya. Penunjuk ini
disebut Penunjuk Nol.
Bentuk Node
Single Linked List non Circular

• Single : field pointer-nya hanya satu dan satu arah,pada


akhir node pointernya menunjuk NULL

Menempati alamat memori tertentu

• Linked List : node-node tersebut saling terhubung satu


sama lain.
• Setiap node pada linked list mempunyai field yang berisi
pointer ke node berikutnya, dan juga memiliki field yang
berisi data.

• Node terakhir akan menunjuk ke NULL yang akan


digunakan sebagai kondisi berhenti pada saat
pembacaan isi linked list.
Pembuatan
Single Linked List non Circular

Deklarasi Node :
typedef struct TNode{
int data;
TNode *next;
};

Keterangan:
• 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
bertipe pointer dari TNode yang berguna sebagai kepala
linked list.

• Digunakan perintah new untuk mempersiapkan sebuah


node baru berserta alokasi memorinya, kemudian node
tersebut diisi data dan pointer nextnya ditunjuk ke NULL.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
Single Linked List non Circular
Menggunakan Head

• Dibutuhkan satu buah variabel pointer : head yang akan


selalu menunjuk pada node pertama
Deklarasi Pointer Penunjuk Head Single Linked List

• Manipulasi linked list tidak dapat dilakukan langsung ke


node yang dituju, melainkan harus menggunakan suatu
pointer penunjuk ke node pertama (Head) dalam linked
list

• Deklarasinya sebagai berikut:


TNode *head;
Fungsi Inisialisasi Single Linked List
void init()
{
head = NULL;
}

Function untuk mengetahui kondisi Single Linked List


• Jika pointer head tidak menunjuk pada suatu node
maka kosong
int isEmpty()
{
if (head == NULL) return 1;
else return 0;
}
Menambah Node di Depan

• Penambahan node baru akan dikaitan 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.

• Prinsipnya adalah mengkaitkan node baru dengan head,


kemudian head akan menunjuk pada data baru tersebut
sehingga head akan tetap selalu menjadi data terdepan.
void insertDepan(int databaru)
{
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1)
{
head=baru;
head->next = NULL;
}
else
{
baru->next = head;
head = baru;
}
printf(”Data masuk\n”);
}
Menambah Node di Belakang

• Penambahan data dilakukan di belakang, namun


pada saat pertama kali, node langsung ditunjuk oleh
head.

• Penambahan di belakang membutuhkan pointer bantu


untuk mengetahui node terbelakang. Kemudian,
dikaitkan dengan node baru.

• Untuk mengetahui data terbelakang perlu digunakan


perulangan.
void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1) {
head=baru;
head->next = NULL;
}
else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
}
printf("Data masuk\n“);
}
Menghapus Node di Depan

• Penghapusan node tidak boleh dilakukan jika keadaan


node sedang ditunjuk oleh pointer, maka harus
dilakukan penggunakan suatu pointer lain (hapus) yang
digunakan untuk menunjuk node yang akan dihapus,
barulah kemudian menghapus pointer hapus dengan
menggunakan perintah delete.

• Sebelum data terdepan dihapus, terlebih dahulu head


harus menunjuk ke node berikutnya agar list tidak putus,
sehingga node setelah head lama akan menjadi head
baru

• Jika head masih NULL maka berarti data masih kosong!


void hapusDepan ()
{
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(“%d terhapus\n“,d);
} else cout<<"Masih kosong\n";
}
Menghapus Node di Belakang

• Membutuhkan pointer bantu dan hapus. Pointer hapus


digunakan untuk menunjuk node yang akan dihapus,
pointer bantu untuk menunjuk node sebelum node yang
dihapus yang akan menjadi node terakhir.

• Pointer bantu digunakan untuk menunjuk ke nilai NULL.


Pointer bantu selalu bergerak sampai sebelum node
yang akan dihapus, kemudian pointer hapus diletakkan
setelah pointer bantu. Selanjutnya pointer hapus akan
dihapus, pointer bantu akan menunjuk ke NULL.
void hapusBelakang(){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
d = hapus->data;
bantu->next = NULL;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(“%d terhapus\n“,d);
} else printf(“Masih kosong\n“);
}
Function untuk menghapus semua elemen
Linked List

void clear()
{
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL)
{
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
Menampilkan / Membaca
Isi Linked List
• Linked list ditelusuri satu-persatu dari awal sampai akhir
node. Penelusuran dilakukan dengan menggunakan
pointer bantu, karena pointer head yang menjadi tanda
awal list tidak boleh berubah/berganti posisi.

• Penelusuran dilakukan terus sampai ditemukan node


terakhir yang 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.

• Jika head masih NULL berarti data masih kosong!


void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=NULL){
cout<<bantu->data<<" ";
bantu=bantu->next;
}
printf(“\n”);
} else printf(“Masih kosong\n“);
}
Single Linked List non Circular
Menggunakan Head dan Tail

• Dibutuhkan dua variabel pointer : head dan tail


• Head selalu menunjuk pada node pertama, sedangkan
tail selalu menunjuk pada node terakhir.
• Kelebihan dari Single Linked List dengan Head & Tail
adalah pada penambahan data di belakang, hanya
dibutuhkan tail yang mengikat node baru saja tanpa
harus menggunakan perulangan pointer bantu.
Inisialisasi Linked List
TNode *head, *tail;

Fungsi Inisialisasi Linked List


void init(){
head = NULL;
tail = NULL;
}

Function untuk mengetahui kondisi LinkedList kosong / tidak


int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
Menambah Node di Depan
Dengan Head dan Tail
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=tail=baru;
tail->next=NULL;
}
else {
baru->next = head;
head = baru;
}
printf(”Data masuk\n”);
}
Menambah Node di Belakang
Dengan Head dan Tail
void tambahBelakang(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=baru;
tail=baru;
tail->next = NULL;
}
else {
tail->next = baru;
tail=baru;
}
printf("Data masuk\n“);
}
Menghapus Node di Depan
(Dengan Head dan Tail)

• Penghapusan node tidak boleh dilakukan jika keadaan


node sedang ditunjuk oleh pointer, maka harus
dilakukan penunjukkan terlebih dahulu dengan pointer
hapus pada head, kemudian dilakukan pergeseran head
ke node berikutnya sehingga data setelah head menjadi
head baru, kemudian menghapus pointer hapus dengan
menggunakan perintah delete.

• Jika tail masih NULL maka berarti list masih kosong!


void hapusDepan(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head!=tail){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
} else {
d = tail->data;
head=tail=NULL;
}
printf(“%d terhapus\n“,d);
} else printf("Masih kosong\n“);
}
Menghapus Node di Belakang
(Dengan Head dan Tail)

• Penghapusan node tidak boleh dilakukan jika keadaan


node sedang ditunjuk oleh pointer, maka harus
dilakukan penunjukkan terlebih dahulu dengan variabel
hapus pada tail. Jika tail masih NULL maka berarti list
masih kosong!

• Dibutuhkan pointer bantu untuk membantu pergeseran


dari head ke node berikutnya sampai sebelum tail,
sehingga tail dapat ditunjukkan ke bantu, dan bantu
tersebut akan menjadi tail yang baru.

• Setelah itu hapus pointer hapus dengan menggunakan


perintah delete.
void hapusBelakang(){
TNode *bantu,*hapus;
int d;
if (isEmpty()==0){
bantu = head;
if(head!=tail){
while(bantu->next!=tail){
bantu = bantu->next;
}
hapus = tail;
tail=bantu;
d = hapus->data;
delete hapus;
tail->next = NULL;
}else {
d = tail->data;
head=tail=NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}
null
Function untuk menghapus semua elemen
LinkedList dengan HEAD & TAIL
void clear()
{
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL)
{
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
Latihan II Soal Struktur Data
(Review Materi Pertemuan 4)
Dikumpulkan pada pertemuan selanjutnya

Buatlah Ilustrasi / Penggambaran untuk


menambah dan menghapus node di posisi tengah
pada :
1. Single Linked List dengan Head
2. Single Linked List dengan Head & Trail
Pertemuan 5

STACK atau TUMPUKAN


STACK (TUMPUKAN)

Merupakan bentuk khusus dari Linier List yang pemasukan


dan penghapusan elemennya hanya dapat dilakukan pada
satu posisi, yaitu posisi akhir dari List (Top)

Prinsip Stack adalah LAST-IN-FIRST-OUT (LIFO).

Klik untuk
Ilustrasi Stack
OPERASI STACK
• ISEMPTY
Untuk memeriksa apakah stack kosong
• ISFULL
Untuk memeriksa apakah stack sudah penuh
• PUSH
Untuk menambahkan item pada posisi paling atas
(TOP)
• POP
Untuk menghapus item paling atas (TOP)
• CLEAR
Untuk mengosongkan stack
STACK PADA ARRAY
Deklarasi MAX_STACK
#define MAX_STACK 5

Deklarasi STACK dengan struct dan array data


typedef struct STACK{
int top;
int data[5];
};

Deklarasi variabel stack dari struct


STACK tumpuk;
Inisialisasi

• Pada mulanya isi top dengan void inisialisasi ()


-1, karena array dalam {
C/C++ dimulai dari 0, berarti tumpuk.top = -1
stack adalah KOSONG }

• TOP adalah variabel


penanda dalam STACK yang 4 MAX_STACK

menunjukkan elemen teratas 3


Stack.
2
• TOP of STACK akan selalu
1
bergerak hingga mencapai
MAX of STACK sehingga 0
menyebabkan stack PENUH TOP = -1
Fungsi IsEmpty
int IsEmpty ()
• Digunakan untuk {
memeriksa apakah if (tumpuk.top == -1
stack masih dalam return 1;
kondisi kosong else
return 0;
• Dengan cara memeriksa }
TOP of STACK.
Jika TOP masih = -1 4 MAX_STACK
maka berarti stack
3
masih kosong
2

0
TOP = -1
Fungsi IsFull

• Digunakan untuk memeriksa apakah kondisi stack


sudah penuh

• Dengan cara memeriksa TOP of Stack.


Jika TOP of STACK = MAX_STACK-1 maka FULL
(Penuh).
Jika TOP of STACK < MAX_STACK-1 maka belum
penuh
int IsFull ()
{
if (tumpuk.top == MAX_STACK-
1
return 1;
else
return 0;
}

4 E MAX_STACK
TOP = 4
3 D
2 C
1 B
0 A
Fungsi PUSH
• Digunakan untuk memasukkan elemen ke dalam stack
dan selalu menjadi elemen teratas stack
• Dengan cara :
1. Menambah satu (increment) nilai TOP of
STACK setiap ada penambahan elemen
stack selama stack masih belum penuh
2. Isikan nilai baru ke stack berdasarkan indeks TOP
of STACK setelah ditambah satu (diincrement)
void push (char d[5])
{
tumpuk.top++
strcpy(tumpuk.data[tumpuk.top],d);
}

4 MAX_STACK 4 MAX_STACK

3 3 PUSH ELEMEN A

2 2

1 1

0 0 A TOP = TOP + 1
= -1 + 1
TOP = -1 = 0
Fungsi POP
• Digunakan untuk menghapus elemen yang berada pada
posisi paling atas dari stack.
• Dengan cara :
1. Ambil dahulu nilai elemen teratas stack dengan
mengakses TOP of STACK.
2. Tampilkan nilai yang akan diambil.
3. Lakukan decrement nilai TOP of STACK
sehingga jumlah elemen stack berkurang 1
void pop ()
{
printf(“Data yg di POP = %s\n”, tumpuk.data[tumpuk.top]);
tumpuk.top--;
}

4 MAX_STACK 4 Data yg di POP = C

3 3
2 C TOP = 2 2
1 B 1 B TOP = TOP - 1
=2-1
0 A 0 A = 1
Fungsi CLEAR
• Digunakan untuk mengosongkan stack / membuat stack
hampa sehingga Top pada Stack berada kembali di
posisi Top = -1

void clear () 4
{
3
tumpuk.data=tumpuk.top=-1
printf(“Data clear”); 2
}
1

0
Latihan I Struktur Data
(Pertemuan 5)

Diketahui suatu stack dgn max_stack = 6


1. Bila dilakukan PUSH 3 elemen kedalam stack,
kemudian di PUSH lagi 2 elemen dan di POP 3
elemen. Maka dimana posisi Top of Stack ?
2. IsEmpty pada kondisi terakhir adalah ?
3. Dari kondisi diatas, Berapa elemen yg hrs di PUSH unt
mencapai kondisi penuh Top of Stack = max_stack ?
4. Berapa elemen yg hrs di POP unt mencapai kondisi
IsEmpty = True

Jawaban dibahas dgn


menggunakan contoh program
Contoh Program Stack

klikdisini
Pertemuan 6

QUEUE (ANTREAN)
PENGERTIAN QUEUE
(ANTREAN)

Struktur Data Antrean (Queue) adalah suatu bentuk


khusus dari List Linier dengan operasi pemasukan data
hanya diperbolehkan pada salah satu sisi, yang disebut
sisi Belakang / ekor (Tail) dan operasi penghapusan
hanya diperbolehkan pada sisi lainnya yang disebut sisi
Depan / kepala (Head) dari LinkedList.

Prinsip Antrean : FIFO (First In First Out)


FCFS (First Come First Serve)

“Yang Tiba lebih awal Maka akan dilayani Terlebih


Dahulu”
Deklarasi Queue

0 1 2 3 4 5 6 7 Max = 8

head = -1
tail = -1
OPERASI QUEUE
• CREATE
Untuk menciptakan dan menginisialisasi Queue
Dengan cara membuat Head dan Tail = -1
• ISEMPTY
Untuk memeriksa apakah queue kosong
• ISFULL
Untuk memeriksa apakah queue sudah penuh
• ENQUEUE
Untuk menambahkan item pada posisi paling belakang
• DEQUEUE
Untuk menghapus item dari posisi paling depan
• CLEAR
Untuk mengosongkan queue
Fungsi Create
• Digunakan untuk membentuk dan menunjukan awal
terbentuknya suatu Antrean / Queue
Void Create()
{
antrian.head = antrian.tail = -1
}

0 1 2 3 4 5 6 7 Max = 8

head = -1 Antrian pertama kali


tail = -1
Fungsi IsEmpty

• Untuk memeriksa apakah Antrian penuh atau kosong

• Dengan cara memeriksa nilai Tail, jika Tail = -1 maka


antrian kosong (empty)

• Head adalah tanda untuk kepala antrian (elemen


pertama dalam antrian) yang tidak akan berubah-ubah

• Pergerakan pada Antrian terjadi dengan penambahan


elemen Antrian kebelakang, yaitu menggunakan nilai
Tail
Int IsEmpty()
{
if (antrian.tail == -1)
return 1;
else
return 0;
}

0 1 2 3 4 5 6 7 Max = 8

head = -1 Antrian kosong


tail = -1 Karena tail = -1
Fungsi IsFull

• Untuk mengecek apakah Antrian sudah penuh


atau belum
• Dengan cara :
- Mengecek nilai Tail
- Jika tail = MAX-1 berarti antrian sudah penuh
(MAX-1 adalah batas elemen array dalam
program C++)
Int IsFull()
{
if (antrian.tail == Max-1)
return 1;
else
return 0;
}

5 10 35 20 15 30 40 25
0 1 2 3 4 5 6 7 Max = 8

Antrian penuh karena


head = 0 tail = 7
Head = 0
tail = max - 1
Fungsi Enqueue
• Untuk menambahkan elemen ke dalam Antrian,
penambahan elemen selalu dilakukan pada
elemen paling belakang

• Penambahan elemen selalu menggerakan variabel


Tail dengan cara menambahkan Tail terlebih dahulu
Fungsi Dequeue
• Digunakan untuk menghapus elemen terdepan (head)
dari Antrian
• Dengan cara : menggeser semua elemen antrian
kedepan dan mengurangi Tail dgn 1. Penggeseran
dilakukan dengan menggunakan looping
Fungsi Clear

• Untuk menghapus elemen-elemen Antrian dengan


cara membuat Tail dan Head = -1

• Penghapusan elemen-elemen Antrian sebenarnya


tidak menghapus arraynya, namun hanya mengeset
indeks pengaksesan-nya ke nilai -1 sehingga
elemen-elemen Antrian tidak lagi terbaca sehingga
mengembalikan antrian seperti keadaan semula
Antrian setelah di lakukan Clear

0 1 2 3 4 5 6 7 Max = 8

head = -1 Antrian kosong


tail = -1 Karena tail = -1
Latihan I Struktur Data
(Pertemuan 6)

Berikan gambaran/ilustrasi dari kasus antrian berikut :


a) Diketahui suatu Antrian/queue dgn max = 6.
b) Lakukan Enqueue 4 elemen ke dalam antrian,
dimanakah posisi Head dan Tail ?
c) Kemudian lakukan Dequeue 2 elemen dari antrian.
Maka dimana posisi Head dan Tail ?
d) Dari keadaan diatas, bagaimanakah kondisi IsFull dan
IsEmpty nya ?

Jawaban dibahas dgn


menggunakan contoh program
Contoh program queue

klikdisini
PERTEMUAN 7
Pertemuan 9

STRUKTUR POHON &


KUNJUNGAN POHON BINER
DEFINISI POHON (TREE)

Pohon (Tree) termasuk struktur non linear yang


didefinisikan sebagai data yang terorganisir dari suatu
item informasi cabang yang saling terkait
Level

Root ---------------------------------- 1
A

B C D ----------------------- 2

E F G H ------------------ 3

Height = 3
Istilah – istilah Dalam Pohon

1. Predesesor
Node yang berada diatas node tertentu.
(contoh : B predesesor dari E dan F)
2. Succesor
Node yang berada dibawah node tertentu.
(contoh : E dan F merupakan succesor dari B)
3. Ancestor
Seluruh node yang terletak sebelum node tertentu dan
terletak pada jalur yang sama.
(contoh : A dan B merupakan ancestor dari F)
4. Descendant
Seluruh node yang terletak sesudah node tertentu
dan terletak pada jalur yang sama.
(contoh : F dan B merupakan ancestor dari A)
5. Parent
Predesesor satu level diatas satu node
(contoh : B merupakan parent dari F)
6. Child
Succesor satu level dibawah satu node
(contoh : F merupakan child dari B)
7. Sibling
Node yang memiliki parent yang sama dengan satu
node (contoh : E dan F adalah sibling)
8. Subtree
Bagian dari tree yang berupa suatu node beserta
descendant-nya (contoh : Subtree B, E, F dan
Subtree D, G, H)
9. Size
Banyaknya node dalam suatu tree (contoh : gambar
tree diatas memiliki size = 8)
10. Height
Banyaknya tingkat/level dalam suatu tree (contoh :
gambar tree diatas memiliki height = 3)
11. Root (Akar)
Node khusus dalam tree yang tidak memiliki
predesesor (Contoh : A)
12. Leaf (Daun)
Node-node dalam tree yang tidak memiliki daun
(contoh : Node E,F,C,G,H)
13. Degree (Derajat)
Banyaknya child yang dimiliki oleh suatu node
(contoh : Node A memiliki derajat 3, node B memiliki
derajat 2)
ISTILAH-ISTILAH DASAR

Pohon atau Tree adalah salah satu bentuk Graph


terhubung yang tidak mengandung sirkuit.

Karena merupakan Graph terhubung, maka pada Pohon


(Tree) selalu terdapat Path atau Jalur yang
menghubungkan setiap simpul dalam dua pohon.

Pohon (Tree) dapat juga didefinisikan sebagai kumpulan


elemen yang salah satu elemennya disebut dengan Akar
(Root) dan sisa elemen lain (Simpul) yang terpecah
menjadi sejumlah himpunan yang saling tidak berhubungan
yang disebut dengan Subpohon (Subtree) atau cabang
Sifat utama Pohon Berakar
1. Jika Pohon mempunyai Simpul sebanyak n, maka
banyaknya ruas atau edge adalah (n-1).
2. Mempunyai Simpul Khusus yang disebut Root, jika
Simpul tersebut memiliki derajat keluar >= 0, dan
derajat masuk = 0.
3. Mempunyai Simpul yang disebut sebagai Daun / Leaf,
jika Simpul tersebut berderajat keluar = 0, dan
berderajat masuk = 1.
4. Setiap Simpul mempunyai Tingkatan / Level yang dimulai
dari Root yang Levelnya = 1 sampai dengan Level ke - n
pada daun paling bawah. Simpul yang mempunyai Level
sama disebut Bersaudara atau Brother atau Stribling.
5. Pohon mempunyai Ketinggian atau Kedalaman atau
Height, yang merupakan Level tertinggi
6. Pohon mempunyai Weight atau Berat atau Bobot, yang
banyaknya daun (leaf) pada Pohon.
7. Banyaknya Simpul Maksimum sampai Level N adalah :
2 (N) - 1
8. Banyaknya Simpul untuk setiap Level I adalah :
N
∑ 2 ( I – 1)
I=1
Hutan (Forest) adalah kumpulan Pohon yang tidak saling
berhubungan
Diketahui suatu bentuk Pohon Berakar T sebagai berikut :

Pohon Diatas Mempunyai :


a. Simpul sebanyak = 8 dan edge = n - 1 = 8 – 1 = 7
b. Root pada Pohon T diatas adalah Simpul P
c. Mempunyai daun (Leaf) = 4, yaitu = R, S, V dan W
d. Level (tingkatan) Pohon = 4 yaitu :
Level 1 = Simpul P
Level 2 = Simpul Q dan T
Level 3 = Simpul R, S dan U
Level 4 = Simpul V dan W
e. Ketinggian atau kedalaman = jumlah level = 4
f. Weight atau berat atau bobot = jumlah daun = 4

Dalam gambar Pohon T diatas dapat dibentuk 2 buah


hutan (forest), bila simpul P dihilangkan, yaitu :
Hutan 1 : Q,R,S
Hutan 2 : T,U,V,W
g. Banyaknya Simpul Maksimum yang dapat terbentuk
sampai Level 4 (bila simpul pada pohon dianggap
penuh) adalah : 2 (N) – 1
2 (4) – 1 = 16 – 1 = 15
h. Banyaknya Simpul maksimum untuk setiap Level I
(bila simpul pada pohon dianggap penuh) adalah :
Maksimum Simpul pada level 2 = 2 ( I – 1)
= 2 (2-1) = 2
Maksimum Simpul pada level 3 = 2 (3-1) = 4
Maksimum Simpul pada level 4 = 2 (4-1) = 2
POHON BINAR (BINARY TREE)

Struktur ini biasanya digunakan untuk menyajikan data


yang mengandung hubungan hirarkial antara elemen-
elemennya.

Bentuk Pohon Berakar yang lebih mudah dikelola dalam


komputer adalah Pohon Biner (Binary Tree) yang lebih
dikenal sebagai Pohon Umum (General Tree) yang dapat
didefinisikan sebagai kumpulan simpul yang mungkin
kosong atau mempunyai akar dan dua Subpohon yang
saling terpisah yang disebut dengan Subpohon Kiri /
cabang kiri (Left Subtree) dan Subpohon Kanan / cabang
kanan (Right Subtree).
Karakteristik Pohon Binar (Binary Tree) :
1. Setiap Simpul paling banyak hanya memiliki dua buah
anak
2. Derajat Tertinggi dari setiap Simpul adalah dua.
3. Dibedakan antara Cabang Kiri dan Cabang Kanan.
4. Dimungkinkan tidak mempunyai Simpul

Berikut ini diberikan contoh gambar Pohon Binar (Binary


Tree) dengan Cabang Kiri dan Cabang Kanan.
ISTILAH PADA POHON BINER
• Pohon Biner Penuh A
(Full Binary Tree)
Semua simpul (kecuali daun) B C
memiliki 2 anak dan tiap cabang
memiliki panjang ruas yang sama D E F G

• Pohon Biner Lengkap


(Complete Binary Tree) A
Hampir sama dengan Pohon Biner
Penuh, semua simpul (kecuali B C
daun) memiliki 2 anak tetapi tiap
cabang memiliki panjang ruas D E
berbeda
• Pohon Biner Similer
Dua pohon yang memiliki struktur yang sama tetapi
informasinya berbeda
A P

B C Q R

• Pohon Biner Ekivalent


Dua pohon yang memiliki struktur dan informasi yang
sama
P P

Q R Q R
• Pohon Biner Miring (Skewed Tree)
Dua pohon yang semua simpulnya mempunyai satu
anak / turunan kecuali daun
Deklarasi Pohon Biner
(Dengan Program C++)

Dalam setiap simpul selalu berisi dua buah Pointer untuk


menunjuk ke cabang Kiri dan cabang Kanan dan informasi
yang akan disimpan dalam simpul tersebut.
Penyajian Pohon Binar
(Binary Tree)
• Tree dapat dibuat dengan menggunakan linked list
secara rekursif.
• Linked list yang digunakan adalah double linked list non
circular
• Data yang pertama kali masuk akan menjadi node root.
• Data yang lebih kecil dari data node root akan masuk
dan menempati node kiri dari node root, sedangkan jika
lebih besar dari data node root, akan masuk dan
menempati node di sebelah kanan node root.
Bila diberikan untai HAKJCBL, maka proses untuk dapat
membentuk pohon biner dari untai diatas adalah :
1. Karakter pertama ‘H’ ditempatkan sebagai akar (root)
2. Karakter ‘A’,karena lebih kecil dari ‘H’, maka akan
menempati cabang kiri.
3. Karakter ‘K’, karena lebih besar dari ‘H’, maka akan
menempati cabang kanan.
4. Karakter ‘J’, lebih besar dari ‘H’ dan kecil dari ‘K’, maka
menempati cabang kiri ‘K’.
Dan begitu seterusnya sehingga terbentuk
pohon biner seperti berikut :
Pertemuan 10

KUNJUNGAN
PADA POHON BINER
3. Kunjungan secara Postorder, mempunyai urutan :
a. Kunjungi Cabang Kiri
b. Kunjungi Cabang Kanan
c. Cetak isi simpul yang dikunjungi (Simpul Akar)
Pada ketiga cara kunjungan diatas, kunjungan ke
Cabang Kiri dilakukan terlebih dahulu, baru kemudian
kunjungan ke Cabang Kanan. Dengan orientasi
semacam ini, Ketiga kunjungan diatas disebut dengan
Left To Right Oriented (LRO).

Jika kunjungan ke Cabang Kanan dilakukan lebih


dahulu baru kemudian kunjungan ke Cabang Kiri, maka
Orientasi semacam ini disebut Right To Left Oriented
(RLO).
A
ABDEC
B C

D E
Klik Animasi
Klik Animasi
Kunjungan PreOrder dalam Program C++
A

B C DBEAC

D E
Klik Animasi
Klik Animasi
Kunjungan InOrder dalam Program C++
3. Kunjungan secara Postorder, mempunyai urutan :
a. Kunjungi Cabang Kiri
b. Kunjungi Cabang Kanan
c. Cetak isi simpul yang dikunjungi (Simpul Akar)

B C DE B C A

D E
Klik Animasi
Klik Animasi
Kunjungan PostOrder dalam Program C++
Kunjungan LevelOrder
Selain kunjungan yang dijelaskan diatas, masih ada
satu macam kunjungan masih ada satu macam
kunjungan lagi yaitu kunjungan LevelOrder.
Kunjungan dimulai dari simpul yang ada pada tingkat
1 (Akar), diteruskan pada simpul di tingkat 2, tingkat 3
dan seterusnya.
Secara singkat kunjungan Level Order ini dapat dijelaskan
sebagai berikut.
1. Dimulai dengan memasukkan Akar kedalam antrean.
2. Kemudian mengeluarkan Akar tersebut keluar dari
antrean.

Pada saat Akar tersebut dikeluarkan dari antrean, cabang


kiri dan cabang kanan secara berturut-turut dimasukkan
dalam antrean.

Dengan kata lain jika suatu elemen dikeluarkan dari


antrean, maka cabang kiri dan kanan dari elemen yang
baru saja dikeluarkan dimasukkan kedalam antrean.
APLIKASI POHON BINER

NOTASI PREFIX, INFIX DAN POSTFIX


Pada bagian ini akan dibahas tentang bagaimana
menyusun sebuah Pohon Binar yang apabila dikunjungi
secara PreOrder akan menghasilkan Notasi Prefix,
kunjungan secara InOrder menghasilkan Notasi Infix, dan
kunjungan PostOrder menghasilkan Notasi Postfix.
Berdasarkan Gambar diatas, apabila dilakukan kunjungan
secara PreOrder, maka akan diperoleh Notasi Prefix dari
persamaan-persamaan yang digambarkan tersebut, yaitu :
+A*BC (Gambar.a)
*+AB-BC (Gambar.b)
^-*+ABC-DE+FG (Gambar.c)

Jika dilakukan kunjungan secara InOrder, akan diperoleh


Notasi Infixnya, yaitu :
(A+(B*C)) (Gambar.a)
((A+B) * (B-C)) (Gambar.b)
(((A+B) * C) – (D-E)^(F+G) (Gambar.c)
Jika dilakukan kunjungan secara PostOrder, akan
diperoleh Notasi Postfixnya, yaitu :
ABC*+ (Gambar.a)
AB+BC-* (Gambar.b)
AB+C*DE-FG+^ (Gambar.c)
Pertemuan 11

GRAPH dan
MATRIK PENYAJIAN GRAPH
GRAPH
Suatu Graph mengandung 2 himpunan, yaitu :
1. Himpunan V yang elemennya disebut simpul (Vertex
atau Point atau Node atau Titik)
2. Himpunan E yang merupakan pasangan tak urut dari
simpul. Anggotanya disebut Ruas (Edge atau rusuk
atau sisi)

Graph seperti dimaksud diatas, ditulis sebagai G(E,V).


Contoh :
Gambar berikut menanyakan Graph G(E,V) dengan :
1. V mengandung 4 simpul, yaitu simpul A,B,C,D.
2. E mengandung 5 ruas, yaitu :
e1 = (A,B) e4 = (C,D)
e2 = (B,C) e5 = (B,D)
e3 = (A,D)
Gambar dibawah ini menyatakan suatu Multigraph.
Disini, ruas e2 pada kedua titik ujungnya adalah simpul
yang sama, yaitu simpul A. Ruas semacam ini disebut
Gelung atau Self-Loop. Sedangkan ruas e5 dan e6
mempunyai titik ujung yang sama, yaitu simpul-simpul B
dan C. Kedua ruas ini disebut ruas berganda atau ruas
sejajar. e3
e2

e1 e4

e5

e6
Suatu Graph yang tidak mengandung ruas sejajar maupun
self-loop, sering disebut juga sebagai Graph sederhana
atau simple Graph.

Suatu Graph G’(E’,V’) disebut Sub Graph dari G(E,V), bila E’


himpunan bagian dari E dan V’ himpunan bagian dari V.

Jika E’ mengandung semua ruas dari E yang titik ujungnya


di V’, maka G’ disebut Subgraph yang direntang oleh V’
(Spanning Subgraph).
Contoh Sub Graph:
Contoh Spanning Sub Graph :
GRAPH BERLABEL

Graph G disebut berlabel jika ruas dan atau simpulnya


dikaitkan dengan suatu besaran tertentu. Khususnya jika
setiap Ruas e dari G dikaitkan dengan suatu bilangan
non negatif d(e), maka d(e) disebut bobot atau panjang
dari ruas e.
Contoh :
Gambar berikut ini menyajikan hubungan antar kota.
Disini simpul menyatakan kota dan label d(e) menyatakan
jarak antara dua kota.
DERAJAT GRAPH

Derajat simpul V, ditulis d(v) adalah banyaknya ruas


yang menghubungi v. Karena setiap ruas dihitung dua
kali ketika menentukan derajat suatu Graph, maka :

Jumlah derajat semua simpul suatu Graph (derajat) =


dua kali banyaknya ruas Graph (Size) Atau dapat
dituliskan :

Derajat Graph = 2 x Size


Pada gambar diatas Jumlah Semua Simpul = 4, maka
Jumlah Derajat Semua Simpul = 8

Jika Derajat masing-masing simpul pada Graph berjumlah


Genap maka Graph tersebut disebut EULER Graph
Contoh :
A B F

C
D E
Pada gambar diatas, banyak ruas/size = 7, sedangkan
derajat masing-masing simpul adalah :
d(A) = 2
d(B) = 5
d(C) = 3
d(D) = 3
d(E) = 1
d(F) = 0

maka, total jumlah derajat simpul adalah : 14

E disebut simpul bergantung/akhir, yaitu simpul yang


berderajat satu. Sedangkan F disebut simpul terpencil,
yaitu simpul yang berderajat Nol.
KETERHUBUNGAN

Walk atau perjalanan dalam Graph G adalah barisan simpul


dan ruas berganti-ganti : V1,e1,V2,e2,......., e n-1, Vn
Disini ruas ei menghubungkan simpul Vi dan Vi+1.
Banyaknya ruas disebut Panjang Walk. Walk dapat ditulis
lebih singkat dengan hanya menulis deretan ruas :
e1,e2, ...., en-1 atau deretan simpul : V1, V2,....., Vn-1, Vn
dimana : V1 = simpul awal
Vn = simpul akhir.

Walk disebut tertutup bila V1 = Vn


Graph merupakan Walk Terbuka, karena tidak ada ruas
yang menghubungkan Simpul U dan T.

Merupakan suatu Path atau Trail terbuka dengan


derajat setiap simpulnya = 2, kecuali simpul awal U dan
simpul akhir T berderajat = 1.
• Barisan ruas a,b,c,d,b,c,g,h adalah Walk bukan Trail
(karena ruas b dua kali muncul).
• Barisan simpul A, B, E, F bukan Walk (karena tdk
ada ruas yang menghubungkan simpul B ke F).
• Barisan simpul A, B, C, D, E, C, F adalah Trail
bukan Jalur/Path (karena c dua kali muncul)
• Barisan ruas a, d, g, k adalah Jalur/Path karena
menghubungkan A dengan F
• Ruas a, b, h, g, e, a, adalah Cycle.

Graph yang tidak mengandung Cycle disebut Acyclic.


Contoh dari Graph Acyclic adalah pohon atau Tree.
Contoh dari acyclic
GRAPH TERARAH (DIRECTED GRAPH / DIGRAPH)

Graph terarah adalah Graph yang dapat menghubungkan


V1 ke V2 saja (1 arah).

Maksimum jumlah busur dari n simpul adalah : n ( n - 1)

Suatu Graph Berarah (Directed Graph) D terdiri atas 2


himpunan :
1) Himpunan V, anggotanya disebut simpul.
2) Himpunan A, merupakan himpunan pasangan terurut,
yang disebut ruas berarah atau arkus.
Contoh, Gambar dibawah ini adalah sebuah Graph
Berarah D(V,A) dengan :
1. V mengandung 4 simpul, yaitu 1, 2, 3 dan 4
2. A mengandung 7 arkus, yaitu (1,4) ,(2,1), (2,1),
(4,2), (2,3), (4,3) dan (2)
Arkus (2,2) disebut gelung (self-loop), sedangkan
arkus (2,1) muncul lebih dari satu kali, disebut
arkus sejajar atau arkus berganda.
Bila arkus suatu Graph Berarah menyatakan suatu bobot,
maka Graph Berarah tersebut dinamakan jaringan /
Network. Biasanya digunakan untuk menggambarkan
situasi dinamis.

Bila V’ himpunan bagian dari V serta A’ himpunan bagian


dari A, dengan titik ujung anggota A’ terletak di dalam V’,
maka dikatakan bahwa D’(V’,A’) adalah Graph bagian
(Subgraph) dari D(V,A).
Bila A’ mengandung semua arkus anggota A yang titik
ujungnya anggota V’, maka dikatakan bahwa D’(V’,A’)
adalah Graph Bagian yang dibentuk atau direntang oleh V’.
CRITICAL PATH

1 3

4 5
MINIMUM SPANNING TREE

Merupakan Spanning Tree yang mempunyai Bobot dan


tidak mempunyai arah dengan hasil penjumlahan
bobotnya adalah minimum.

Lihat gambar Graph G berikut :


V2

V1 V3

V4 V5
Langkah yang dilakukan untuk membentuk minimum
spanning tree adalah :

Bentuk kembali semua simpul tetapi tanpa ruas.


Gambar dan telusuri ruas dengan bobot paling kecil,
seterusnya (secara ascending) hingga semua simpul
terhubung
V2

(6)
V1 (5) V3 Total Minimum
Spanning Tree = 22
(7) (4)

V4 V5
Karena V8 sudah dilewati setelah
penelusuran ke V4, maka penelusuran yang
berikutnya dianggap tidak dilewati lagi
Klik Animasi
2. Breadth First Search (BFS).

Berbeda dengan cara BFS, dengan BFS penelusuran


akan diawasi dari Node-1, kemudian melebar pada
Adjacent Node dari Node-1 dan diteruskan pada
Node-2, Node- 3 dan seterusnya.
Dari gambar di atas akan diperoleh urutan :
V1 , V2 ---> V3 , V4 ---> V5 ---> V6 ---> V7, V8

Klik Animasi
Pertemuan 12-14

PRESENTASI
PROJECT
PERTEMUAN 15

Anda mungkin juga menyukai