Anda di halaman 1dari 27

FINAL PROJECT STRUKTUR DATA

“Pendataan Tiket Bus Menggunakan BST dan AVL Tree”

Disusun Oleh :
Kelompok 8

Royan Hisyam Rafliansyah (20081010130)


Irsyad Rafi Naufaldi (21081010017)
Moh. Ayyuhan Fawwazansa (21081010302)

PROGRAM STUDI TEKNIK INFORMATIKA


FAKULTAS ILMU KOMPUTER
UNIVERSITAS PEMBANGUNAN NASIONAL “VETERAN”
JAWA TIMUR
2022
SURAT PERNYATAAN

Kami yang bertanda tangan di bawah ini:

1. NAMA : Royan Hisyam Rafliansyah

NPM : 20081010130

2. NAMA : Irsyad Rafi Naufaldi

NPM : 21081010017

3. NAMA : Moh. Ayyuhan Fawwazansa

NPM : 21081010302

Dengan ini menyatakan bahwa hasil pekerjaan yang kami serahkan sebagai bagian dari
penilaian mata kuliah Struktur Data adalah benar-benar karya orisinal kami, bukan milik
orang lain, dan tidak pernah digunakan dalam penilaian tugas yang lain dalam mata
kuliah apapun, baik secara keseluruhan ataupun sebagian, di Universitas
Pembangunan Nasional“Veteran” Jawa Timur ataupun di institusi lainnya.

Surabaya, 27 Desember 2022

Royan Hisyam R. Irsyad Rafi N. Moh. Ayyuhan F.


I. PENDAHULUAN
Pada Final Project ini kelompok kami membuat program pendataan tiket bus yang
mengimplementasikan Binary Search Tree (BST) dan AVL Tree. Pada program ini kami
menggunakan bahasa C++. Penggunaan Adelson-Velskii Landis (AVL) Tree pada
program ini digunakan untuk menyeimbangkan pohon biner yang dihasilkan oleh BST.
Penggunaan BST dan AVL Tree juga sangat berguna untuk melakukan penyimpanan dan
pengolahan data yang terstruktur. Hal tersebut menjadikan program akan menjadi efisien
dan dan cepat dalam pengolahan data. Selain itu, BST dan AVL Tree memiliki operasi
lain yang berguna seperti insert, delete, dan search, yang dapat mempermudah dalam
pengolahan data dengan lebih efisien.
Laporan UAS ini akan menjelaskan tentang implementasi BST dan AVL Tree,
serta menunjukkan cara kerja dan kelebihan dari kedua struktur data tersebut. Laporan ini
akan menunjukan BST dan AVL Tree dalam program yang membutuhkan data yang
cepat dan efisien. Pada Final Project ini topik yang kami ambil adalah pendataan tiket
bus.

II. TEORI
● Binary Search Tree (BST)
Binary Search Tree adalah struktur data yang mengadopsi konsep Binary Tree
namun terdapat aturan bahwa setiap child node sebelah kiri selalu lebih kecil
nilainya dari pada root node. Begitu pula sebaliknya, setiap child node sebelah
kanan selalu lebih besar nilainya daripada root node.

● Adelson-Velskii Landis (AVL) Tree


AVL Tree adalah Binary Search Tree yang dimodifikasi untuk meningkatkan
kinerjanya, mempunyai sebuah self-balancing BST yang perbedaan antara height
dari subtree kiri dan kanan maksimal hanya 1 untuk semua node. Operasi yang
dapat dilakukan terhadap sebuah AVL Tree adalah sama dengan operasi yang ada
pada Binary Search Tree dengan sedikit modifikasi setelah melakukan insert
maupun delete. Tambahan modifikasi AVL tree yaitu proses rebalancing
(penyeimbangan kembali) dari bentuk tree agar tetap memenuhi kaidah dan
sifat-sifat sebuah binary tree.
III. SOURCE CODE PROGRAM

#include<iostream>
using namespace std;

struct dataBus{
string nama;
string pemberangkatan;
string tujuan;
int kursi;
};
struct dataBus bus[500];

Pada source code di atas melakukan deklarasi library dan struct. Library yang
digunakan adalah iostream. Pada struct melakukan deklarasi data bus yang terdapat
nama, pemberangkatan, tujuan, dan kursi. Untuk nama, pemberangkatan, dan tujuan
menggunakan tipe data string sedangkan untuk kursi menggunakan tipe data int.

template <typename T>


class BST{
public:
class data{
public:
T nomor;
int nkiri;
data * kiri;
data * kanan;
data * induk;
data(T j, data * p){
induk = p;
nkiri = 0;
nomor = j;
kiri = NULL;
kanan = NULL;
}
};
data * root = NULL;
int n;
void input(T y){
root=inputData(root, y, NULL);
}
void hapus(T y){
root=hapusData(root, y, NULL);
}
data * cari(T y){
return cariData(root,y);
}
void inorder(){
inorderUtil(root);
cout<<endl;
}
T ksmallest(int j){
return ksmallestUtil(root, j);
}
int urutan(T y){
return urutData(root, y, 0);
}

Pada source code diatas membuat class BST yang dimana di dalam class tersebut
terdiri dari public dan private. Pada bagian diatas merupakan public pada class BST.
Pada class public melakukan deklarasi class data yang berisi deklarasi pointer kiri,
kanan, induk, dan p. Selanjutnya menggunakan fungsi void untuk input, hapus, dan
inorder.

private:
void inorderUtil(data * head){
if(head==NULL) return ;
inorderUtil(head->kiri);
cout <<
"==========================================================="
<< endl;
cout << " Kursi Bus nomor " << head -> nomor
<< "\n";
int temp = head -> nomor;
cout <<
"==========================================================="
<< endl;
cout << "\t\t DATA PENUMPANG" << endl;
cout <<
"==========================================================="
<< endl;
cout << " Nama Penumpang : " << bus[temp].nama
<< endl;
cout << " Pembrangkatan : " <<
bus[temp].pembrangkatan << endl;
cout << " Tujuan : " <<
bus[temp].tujuan << endl;
cout <<
"==========================================================="
<< endl;
cout << endl;
inorderUtil(head->kanan);
}
data * inputData(data * head, T y, data * p){
if(head == NULL){
n++;
data * temp = new data(y,p);
while(p!=NULL){
if(y<p->nomor) p->nkiri += 1;
p=p->induk;
}
return temp;
}
if(y > head->nomor) head->kanan =
inputData(head->kanan, y, head);
else if(y < head->nomor) head->kiri =
inputData(head->kiri, y, head);
return head;
}
data * cariData(data * head, T y){
if(head == NULL) return NULL;
T j = head->nomor;
if(j == y) return head;
if(j > y) return cariData(head->kiri, y);
if(j < y) return cariData(head->kanan, y);
}
int urutData(data * head, T y, int r){
if(head == NULL) return 0;
T j = head->nomor;
if(j == y) return r+1+head->nkiri;
if(j > y) return cariData(head->kiri, y, r);
if(j < y) return cariData(head->kanan, y,
r+head->nkiri+1);
}
data * hapusData(data * head, T y, data * p){
if(head == NULL) return NULL;
if(y == head->nomor){
data * l = head->kiri;
data * r = head->kanan;
while(p!=NULL){
if(y<p->nomor) p->nkiri -= 1;
p=p->induk;
}
if(l == NULL){
delete(head);
return r;
}
if(r == NULL){
delete(head);
return l;
}
while(r->kiri != NULL) r = r->kiri;
head->nomor = r->nomor;
head->kanan = hapusData(head->kanan, r->nomor,
NULL);
return head;
}
if(y < head->nomor) head->kiri =
hapusData(head->kiri, y, head);
else head->kanan = hapusData(head->kanan, y,
head);
return head;
}

T ksmallestUtil(data * head, int j){


if(j<1 || j>n) return NULL;
if(head->nkiri == j-1) return head->nomor;
if(head->nkiri > j-1) return
ksmallestUtil(head->kiri, j);
return ksmallestUtil(head->kanan,
j-1-head->nkiri);
}
};

Source diatas merupakan bagian private dari class BST. Pada bagian ini berisi deklarasi
dari fungsi void yang terdapat pada public.

template <typename L>


class AVL{
public:
class data{
public:
L nomor;
int tinggi;
data * kiri;
data * kanan;
data(L j){
tinggi = 1;
nomor = j;
kiri = NULL;
kanan = NULL;
}
};
data * root = NULL;
int n;
void input(L y){
root=inputData(root, y);
}
void hapus(L y){
root=hapusData(root, y);
}
data * cari(L y){
return cariData(root,y);
}
void inorder(){
inorderUtil(root);
cout<<endl;
}

Pada source code diatas membuat class AVL yang dimana di dalam class tersebut
terdiri dari public dan private. Pada bagian diatas merupakan public pada class BST.
Pada class public melakukan deklarasi class data yang berisi deklarasi pointer kiri dan
kanan. Selanjutnya menggunakan fungsi void untuk input, hapus, dan inorder. Selain
itu, terdapat data yang di pointer dengan cari untuk melakukan cari data.

private:
int tinggi(data * head){
if(head==NULL) return 0;
return head->tinggi;
}
data * rotasiKanan(data * head){
data * newhead = head->kiri;
head->kiri = newhead->kanan;
newhead->kanan = head;
head->tinggi = 1+max(tinggi(head->kiri),
tinggi(head->kanan));
newhead->tinggi = 1+max(tinggi(newhead->kiri),
tinggi(newhead->kanan));
return newhead;
}

data * rotasiKiri(data * head){


data * newhead = head->kanan;
head->kanan = newhead->kiri;
newhead->kiri = head;
head->tinggi = 1+max(tinggi(head->kiri),
tinggi(head->kanan));
newhead->tinggi = 1+max(tinggi(newhead->kiri),
tinggi(newhead->kanan));
return newhead;
}

void inorderUtil(data * head){


if(head==NULL) return ;
inorderUtil(head->kiri);
cout <<
"==========================================================="
<< endl;
cout << " Kursi Bus nomor " << head -> nomor
<< "\n";
int temp = head -> nomor;
cout <<
"==========================================================="
<< endl;
cout << "\t\t DATA PENUMPANG" << endl;
cout <<
"==========================================================="
<< endl;
cout << " Nama Penumpang : " << bus[temp].nama
<< endl;
cout << " Pembrangkatan : " <<
bus[temp].pembrangkatan << endl;
cout << " Tujuan : " <<
bus[temp].tujuan << endl;
cout <<
"==========================================================="
<< endl;
cout << endl;
inorderUtil(head->kanan);
}

data * inputData(data * head, L y){


if(head==NULL){
n+=1;
data * temp = new data(y);
return temp;
}
if(y < head->nomor) head->kiri =
inputData(head->kiri, y);
else if(y > head->nomor) head->kanan =
inputData(head->kanan, y);
head->tinggi = 1 + max(tinggi(head->kiri),
tinggi(head->kanan));
int bal = tinggi(head->kiri) -
tinggi(head->kanan);
if(bal>1){
if(y < head->kiri->nomor){
return rotasiKanan(head);
}else{
head->kiri = rotasiKiri(head->kiri);
return rotasiKanan(head);
}
}else if(bal<-1){
if(y > head->kanan->nomor){
return rotasiKiri(head);
}else{
head->kanan = rotasiKanan(head->kanan);
return rotasiKiri(head);
}
}
return head;
}
data * hapusData(data * head, L y){
if(head==NULL) return NULL;
if(y < head->nomor){
head->kiri = hapusData(head->kiri, y);
}else if(y > head->nomor){
head->kanan = hapusData(head->kanan, y);
}else{
data * r = head->kanan;
if(head->kanan==NULL){
data * l = head->kiri;
delete(head);
head = l;
}else if(head->kiri==NULL){
delete(head);
head = r;
}else{
while(r->kiri!=NULL) r = r->kiri;
head->nomor = r->nomor;
head->kanan = hapusData(head->kanan,
r->nomor);
}
}
if(head==NULL) return head;
head->tinggi = 1 + max(tinggi(head->kiri),
tinggi(head->kanan));
int bal = tinggi(head->kiri) -
tinggi(head->kanan);
if(bal>1){
if(tinggi(head->kiri) >= tinggi(head->kanan)){
return rotasiKanan(head);
}else{
head->kiri = rotasiKiri(head->kiri);
return rotasiKanan(head);
}
}else if(bal < -1){
if(tinggi(head->kanan) >= tinggi(head->kiri)){
return rotasiKiri(head);
}else{
head->kanan = rotasiKanan(head->kanan);
return rotasiKiri(head);
}
}
return head;
}
data * cariData(data * head, L y){
if(head == NULL) return NULL;
L j = head->nomor;
if(j == y) return head;
if(j > y) return cariData(head->kiri, y);
if(j < y) return cariData(head->kanan, y);
}
};

Source diatas merupakan bagian private dari class BST. Pada bagian ini berisi deklarasi
dari fungsi void yang terdapat pada public.
int main(){
BST <float> t;
AVL <float> l;

int i, main, menu2, jumlah, kursi, temp;


char back;
beranda:
cout <<
"============================================================"
<< endl;
cout << "\t\t\tKELOMPOK 8" << endl;
cout << "\t\t\t UAS" << endl;
cout << "\t\t Basis Data Lanjut" << endl;
cout <<
"============================================================"
<< endl;
cout << "\t\t PEMBELIAN TIKET BUS" << endl;
cout <<
"============================================================"
<< endl;
cout << "| 1. Beli Tiket
|" << endl;
cout << "| 2. Hapus Tiket
|" << endl;
cout << "| 3. Cari Tiket
|" << endl;
cout << "| 4. Display Tiket
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Pilih(1/2/3/4) : "; cin >> main;
system("cls");

if(main == 1){
input:
cout <<
"============================================================"
<< endl;
cout << "|\t\t PEMBELIAN TIKET BUS
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "| 1. BST
|" << endl;
cout << "| 2. AVL
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Pilih (1/2) : "; cin >> menu2;
cin.ignore();
cout << endl;

if(menu2 == 1 || menu2 == 2){


cout <<
"============================================================"
<< endl;
cout << "|\t\tJam Keberangkatan Bus
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "| Jam 14.00 (01-35)
|" << endl;
cout << "| Jam 15.00 (36-70)
|" << endl;
cout << "| Jam 16.00 (71-105)
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Jumlah tiket yang dibeli : ";
cin >> jumlah;
cin.ignore();
system("cls");

if(menu2 == 1){
for(i = 0; i<jumlah; i++){
cout <<
"============================================================"
<< endl;
cout << "\t\t Data Penumpang
ke- " << i+1 << endl;
cout <<
"============================================================"
<< endl;
cout << " Nomor Kursi yang
dipilih : "; cin >> kursi; cin.ignore();
cout << " Nama Penumpang
: "; cin >> bus[kursi].nama;
cout << " Keberangkatan
: "; cin >> bus[kursi].pembrangkatan;
cout << " Tujuan
: "; cin >> bus[kursi].tujuan;

bus[kursi].kursi = kursi;

t.input(kursi);
cin.ignore();
cout<<endl;
}
salah:
cout <<
"==========================================================="
<< endl;
cout << "Apakah ingin kembali
ke menu awal (Y/N)"; cin >> back;

if(back == 'Y'|| back == 'y'){


system("cls");
goto beranda;
}
else if(back == 'N'|| back ==
'n'){
exit(0);
}
else{
system("cls");
cout << "Format yang
dimasukan salah!";
goto salah;
}
}
else{
for(i = 0; i<jumlah; i++){
cout <<
"============================================================"
<< endl;
cout << "\t\t Data Penumpang
ke- " << i+1 << endl;
cout <<
"============================================================"
<< endl;
cout << " Nomor Kursi yang
dipilih : "; cin >> kursi; cin.ignore();
cout << " Nama Penumpang
: "; cin >> bus[kursi].nama;
cout << " Keberangkatan
: "; cin >> bus[kursi].pembrangkatan;
cout << " Tujuan
: "; cin >> bus[kursi].tujuan;

bus[kursi].kursi = kursi;

l.input(kursi);
cin.ignore();
cout<<endl;
}
salah1:
cout <<
"============================================================"
<< endl;
cout << "Apakah ingin kembali
ke menu awal (Y/N)"; cin >> back;
cout <<
"============================================================"
<< endl;

if(back == 'Y'|| back == 'y'){


system("cls");
goto beranda;
}
else if(back == 'N'|| back ==
'n'){
exit(0);
}
else{
system("cls");
cout << "Format yang
dimasukan salah!";
goto salah;
}
}
}
}

Pada bagian diatas merupakan main program ini. Source code diatas mendeklarasikan
int i, main, menu2, jumlah, kursi, dan temp. Selanjutnya melakukan deklarasi char
back. Terdapat menu utama yang diberi nama beranda. Pada beranda terdapat pilihan
beli tiket, hapus tiket, cari tiket, dan display tiket. Pilihan menu beli tiket terdapat
pilihan lagi BST dan AVL untuk melakukan input.

else if(main == 2){


hapus:
cout <<
"============================================================"
<< endl;
cout << "|\t\t HAPUS TIKET BUS
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "| 1. BST
|" << endl;
cout << "| 2. AVL
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Pilih (1/2) : "; cin >> menu2;
cin.ignore();
cout << endl;

if(menu2 == 1||menu2 == 2){


cout <<
"============================================================"
<< endl;
cout << " Nomor Kursi yang dihapus : ";
cin >> kursi;
cout <<
"============================================================"
<< endl;

if(menu2 == 1){
if(kursi == bus[kursi].kursi){
t.hapus(kursi);
cout << " Data penumpang telah
dihapus" << endl;
}
else{
cout << " DATA TIDAK
DITEMUKAN!" << endl;
}
}
else if(menu2 == 2){
if(kursi == bus[kursi].kursi){
l.hapus(kursi);
cout << " Data penumpang telah
dihapus" << endl;
}
else{
cout << " DATA TIDAK
DITEMUKAN!" << endl;
}
}
cout << endl;
goto salah;
}
else{
system("cls");
cout << "Format yang dimasukan salah!" <<
endl;
goto hapus;
}
}

Pada source code diatas merupakan pilihan menu hapus tiket. Pada menu hapus
terdapat pilihan hapus menggunakan BST dan AVL.
else if(main == 3){
cari:
cout <<
"============================================================"
<< endl;
cout << "|\t\t CARI TIKET BUS
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "| 1. BST
|" << endl;
cout << "| 2. AVL
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Pilih (1/2) : "; cin >> menu2;
cin.ignore();
cout << endl;

if(menu2 == 1 || menu2 == 2){


cout <<
"============================================================"
<< endl;
cout << " Masukan Nomor Kursi : "; cin >>
kursi;
cout <<
"============================================================"
<< endl;

if(menu2 == 1){
if(kursi == bus[kursi].kursi){
cout <<
"============================================================"
<< endl;
cout << " Nomor Kursi " <<
kursi << endl;
cout <<
"============================================================"
<< endl;
cout << " DATA PENUMPANG" <<
endl;
cout << " Nama Penumpang : "
<< bus[kursi].nama << endl;
cout << " Keberangkatan : "
<< bus[kursi].pembrangkatan << endl;
cout << " Tujuan : "
<< bus[kursi].tujuan << endl;
}else{
cout << " DATA TIDAK
DITEMUKAN!" << endl;
}
}
else if(menu2 == 2){
if(kursi == bus[kursi].kursi){
cout <<
"============================================================"
<< endl;
cout << " Nomor Kursi " <<
kursi << endl;
cout <<
"============================================================"
<< endl;
cout << " DATA PENUMPANG" <<
endl;
cout << " Nama Penumpang : "
<< bus[kursi].nama << endl;
cout << " Keberangkatan : "
<< bus[kursi].pembrangkatan << endl;
cout << " Tujuan : "
<< bus[kursi].tujuan << endl;
}else{
cout << " DATA TIDAK
DITEMUKAN!" << endl;
}
}
cout << endl;
goto salah;

}
else{
system("cls");
cout << "Format yang dimasukan
salah!" << endl;
goto cari;
}
}

Pada source code diatas merupakan pilihan menu cari tiket. Pada menu cari terdapat
pilihan cari menggunakan BST dan AVL.

else if(main == 4){


display:
cout <<
"============================================================"
<< endl;
cout << "|\t\t DISPLAY TIKET BUS
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "| 1. BST
|" << endl;
cout << "| 2. AVL
|" << endl;
cout <<
"============================================================"
<< endl;
cout << "Pilih (1/2) : "; cin >> menu2;
cin.ignore();
cout << endl;

if(menu2 == 1){
system("cls");
t.inorder();
goto salah;
}
else if(menu2 == 2){
system("cls");
l.inorder();
goto salah;
}
else{
system("cls");
cout << " Format yang dimasukan salah!"
<< endl;
}
}
else{
cout << "Format yang dimasukan salah!" << endl;
goto beranda;
}
return 0;
}

Pada source code diatas merupakan pilihan menu display tiket. Pada menu display
terdapat pilihan display menggunakan BST dan AVL.
IV. SCREENSHOTS PROGRAM

Gambar diatas merupakan menu utama dari program yang kami buat. Terdapat pilihan
beli tiket, hapus tiket, cari tiket, dan display tiket.

Gambar diatas merupakan pilihan beli tiket yang menggunakan BST untuk inputnya.
Gambar diatas merupakan input dengan menggunakan BST.

Gambar diatas merupakan pilihan beli tiket yang menggunakan AVL untuk inputnya.
Gambar diatas merupakan input dengan menggunakan AVL.

Gambar diatas merupakan pilihan hapus tiket menggunakan BST.


Gambar diatas merupakan pilihan hapus tiket menggunakan AVL.

Gambar diatas merupakan pilihan menu daricari data menggunakan BST.


Gambar diatas merupakan pilihan menu dari cari data menggunakan AVL.

Gambar diatas merupakan menu pilihan dari display tiket.


Gambar diatas merupakan display tiket menggunakan BST.

Gambar diatas merupakan display tiket menggunakan AVL.


V. ANALISIS DATA
● Binary Search Tree
Tree yang di masukkan pada BST adalah 5, 10, 15, 20.

Node diatas merupakan data setelah diinputkan menggunakan BST. Data yang
dimasukan selalu terdapat pada sub-tree kanan karena BST memiliki prinsip
kanan lebih besar dari kiri.
● Adelson-Velski Landis (AVL) Tree
Tree pada AVL Tree dibentuk dengan nomor: 5, 10, 15, 20, 25. Untuk
langka-langkanya sebagai berikut:

Pada langka pertama 5 dan 10 seperti pada gambar diatas


Selanjutnya ditambahkan 15 yang akan membuat sub-tree kanan tidak imbang
dengan sub-tree kiri. Oleh karena itu, tree ini perlu diseimbangkan dengan AVL
Tree.

Jika sudah dirotasi akan seperti pada gambar

Selanjutnya akan ditambahkan 20 pada tree


Kemudian ditambahkan 25 pada tree yang akan membuat tidak seimbang bagian
kanan dan kiri. Maka perlu dilakukan rotasi lagi pada tree.

Setelah dilakukan rotasi akan berbentuk seperti pada gambar diatas.

Anda mungkin juga menyukai