Laporan Praktikum Resmi - Tree 2
description
Transcript of Laporan Praktikum Resmi - Tree 2
LAPORAN PRAKTIKUM RESMI
ALGORITMA STRUKTUR DATA II
POHON BINER (BINARY TREE)
Disusun oleh :
Velisia Puspita Devi
201301023
Dosen pengampu :
Yosef Murya Kusuma Ardhana.S.T., M.Kom
JURUSAN SISTEM INFORMASI
SEKOLAH TINGGI ILMU KOMPUTER
YOS SUDARSO
PURWOKERTO
2014
BAB I
LANDASAN TEORI
1. Pengantar
Tree merupakan struktur data non linear. Struktur data dalam
bentuk pohon (tree) dapat diartikan sebuah struktur data yang secara
bentuk menyerupai sebuah pohon, yang terdiri dari serangkaian simpul
atau node yang saling berhubungan.
Simpul-simpul atau node tersebut dihubungkan oleh sebuah vektor.
Setiap simpul dapat memiliki 0 atau lebih node anak (child). Sebuah node
yang memiliki node anak disebut node induk (parent).
Sebuah node anak hanya memiliki satu node induk. Sesuai
konvensi ilmu komputer, tree bertumbuh ke bawah, dengan demikian node
anak akan digambarkan berada di bawah node induknya.
Node yang berada di pangkal tree disebut node akar (root),
sedangkan node yang berada di paling ujung pada piramida tree disebut
node daun (leaf).
A. Struktur Tree
Semua bulatan disebut simpul (node).
Node G adalah node induk dari H, I, J.
Node H, I, J adalah node anak dari G.
2
Akar (root) adalah simpul yang tidak memiliki superordinat. Untuk
pohon yang dicontohkan di atas, maka root adalah node A.
Daun (leaf) adalah simpul yang tidak memiliki subordinat. Untuk
pohon diatas dicontohkan diatas, maka leaf adalah node D, E, F, H, I, J.
a. Superordinat dan Subordinat
Node B merupakan superordinat node E dan node F.
Node E dan F mempunyai superordinat yang sama, yaitu node B.
Node B mempunyai subordinat, yaitu node E (node) dan F (node).
Node E dan node F merupakan subordinat simpul B.
b. Tingkat (Level) dan Kedalaman (Depth)
- Tingkat (level)
Root dinyatakan berada pada level 0 (namun ada juga
dibeberapa buku literatur lain menyebutnya level 1).
3
INFO
- Kedalaman (depth)
Tree yang mempunyai posisi paling atas atau level teratas.
c. Derajat (Degree) Sebuah Node
Degree pada sebuah node menyatakan jumlah subordinat dari node
tersebut.
Untuk tree yang dicontohkan pada gambar diatas :
Node A : degree = 3.
Node B : degree = 2.
Node C : degree = 0.
Node D : degree = 3.
B. Pohon Biner (Binary Tree)
Pohon Biner adalah sebuah tree yang pada masing-masing
simpulnya hanya dapat memiliki maksimum 2 simpul anak, tidak boleh
lebih. Pada pohon biner umumnya kedua node anak (child) disebut dengan
posisinya, yaitu subordinat kiri (left child) dan subordinat kanan (right
child).
Ada banyak cara dalam mengilustrasikan struktur sebuah node
binary tree, namum yang paling umum adalah ilustrasi seperti pada
gambar di bawah ini.
4
C
F
A
B
D E G
Left Right
a. Pohon Biner dengan Depth 3
Ilustrasi gambar di bawah ini merupakan contoh dari pohon biner
dengan depth = 3.
b. Stricly Binary Tree
Stricly Binary Tree adalah pohon biner yang semua node-nya
(kecuali simpul leaf) mempunyai lengkap node subordinat kiri dan node
subordinat kanan.
c. Complete Binary Tree
Complete Binary Tree dengan depth = d adalah pohon biner stricly
binary tree, dimana semua leaf hanya berada pada level d. Maka, pada
completely binary tree berlaku:
Pada level k jumlah node
n=2^k
Untuk tree dengan depth d, maka jumlah node
5
n=2^(d+1)-1
Untuk tree dengan depth d, maka jumlah node leaf
n=2^d
Untuk tree dengan depth d, maka jumlah node bukan leaf
n=(2^d)-1
Bila jumlah seluruh node=n, maka depth tree adalah
d=log2(n+1)-1
Complete Binary Tree dengan depth = d, memiliki cirri-ciri:
Setiap node yang berada di bawah d-1, memiliki 2 subordinat.
Jika pada level d-1 subtree kanan ada node yang mempunyai
subordinat, maka setiap node pada level d-1 subtree kiri harus
memiliki subordinat kiri dan kanan.
d. Balance Binary Tree
Balance Binary Tree atau pohon biner seimbang atau biasa disebut
dengan pohon AVL adalah pohon biner dengan ketinggian subtree kiri dan
subtree kanan untuk setiap node superordinat paling banyak selisih 1.
AVL Tree muncul untuk menyeimbangkan Binary Search Tree . Dengan
AVL Tree, waktu pencarian dan bentuk tree dapat dipersingkat dan
disederhanakan.
Selain AVL Tree, terdapat pula Height Balanced and Tree, yakni
Binary Search Tree yang memiliki perbedaan level antara subtree kiri dan
subtree kanan maksimal adalah n. Sehingga AVL Tree adalah Height
Balanced 1 Tree.
Untuk mempermudah menyeimbangkan tree, maka digunakan
simbol-simbol bantu.
- (tanda minus) : digunakan apabila subtree kiri lebih panjang dari
subtree kanan.
+ (tanda plus) : digunakan apabila subtree kanan lebih panjang
dari subtree kiri.
6
0 (nol) : digunakan apabila subtree kanan dan subtree kiri
memiliki height yang sama.
C. Penomoran Node Pohon Biner
Untuk melakukan konversi, telah disepakati cara penomoran setiap
node dalam binary tree sebagai berikut:
● jika sebuah node bernomor n, maka subordinat kiri bernomor 2n dan
subordinat kanan bernomor 2n+1.
● dengan mengetahui dari nomor setiap node maka sebuah binary tree
dapat direpresentasikan ke dalam sebuah array satu dimensi.
D. Operasi Pada Pohon Biner
Operasi pada binary tree merupakan satu rangkaian proses yang
dapat dibagi menjadi beberapa bagian operasi (fungsi) seperti:
- Inisialisasi
- Pembuatan sebuah node
- Pembuatan node akar
- Penambahan node baru
- Penghapusan node dari sebuah tree
- Pembacaan atau penelusuran binary tree
Pembagian ini bukan berdasarkan urutan proses, namun hanya
berdasarkan fungsinya yang berbeda. Sebelum proses di atas dapat
dilakukan, tentunya segala sesuatu yang diperlukan harus disiapkan
terlebih dahulu, antara lain mendeklarasikan struktur node dan semua
pointer yang diperlukan.
E. Proses Inisialisasi
Inisialisasi yang dimaksud adalah pemberian nilai awal pada suatu
variabel atau kondisi yang dapat digunakan sebagai cirri suatu kondisi.
BAB II
7
PENJELASAN PROGRAM
1. Latihan Praktikum
Pada bab ini akan membahas tentang listing program yang telah
digunakan untuk latihan pada pertemuan kedua. Latihan yang dilakukan
mencakup pada Listing Program Tree.
Listing Program Tree
/* * Program-Tree(Lagi).cpp * * Created on: Sep 19, 2014 * Author: home */
#include <iostream>#include <malloc.h>#include <conio.h>#define Nil NULLusing namespace std;
struct nod{
struct nod *left;char data;struct nod *right;
};
typedef struct nod NOD;typedef NOD POKOK;
NOD *NodBaru(char item){
NOD *n;n=(NOD *) malloc (sizeof(NOD));if(n !=Nil){
n->data=item;n->left=Nil;n->right=Nil;
}return n;
}
void BinaPokok(POKOK **T){
8
*T=Nil;}
typedef enum {FALSE=0, TRUE=1} BOOL;
BOOL PokokKosong(POKOK *T){
return((BOOL)(T==Nil));}
void TambahNod(NOD **p, char item){
NOD *n;n=NodBaru(item);*p=n;
}
void preOrder(POKOK *T){
if(!PokokKosong(T)){
cout<<" "<<T->data;preOrder(T->left);preOrder(T->right);
}}
void inOrder(POKOK *T){
if(!PokokKosong(T)){
inOrder(T->left);cout<<" "<<T->data;inOrder(T->right);
}}
void postOrder(POKOK *T){
if(!PokokKosong(T)){
postOrder(T->left);postOrder(T->right);cout<<" "<<T->data;
}}
int main(){
POKOK *kelapa;char buah;
BinaPokok(&kelapa);TambahNod(&kelapa, buah='M');TambahNod(&kelapa->left, buah='E');
9
TambahNod(&kelapa->left->right, buah='I');TambahNod(&kelapa->right, buah='L');TambahNod(&kelapa->right, buah='O');TambahNod(&kelapa->right->left, buah='D');
cout<<"Tampilan secara PreOrder: ";preOrder(kelapa);cout<<endl;cout<<"Tampilan secara InOrder: ";inOrder(kelapa);cout<<endl;cout<<"Tampilan secara PostOrder: ";postOrder(kelapa);cout<<endl;cout<<endl;
return 0;}
Hasil Output Program Tree
Penjelasan Program Tree
1. #include merupakan pengarah preprocessor yang berfungsi untuk
menginstruksikan compiler untuk menyertakan berkas C++ sebelum di
compile.
2. <iostream> adalah sebuah library yang berfungsi untuk memanggil library
C++. Library iostream berfungsi untuk input dan output (cin dan cout).
3. Using namespace std merupakan standart device.
4. main merupakan badan fungsi atau fungsi utama.
5. Struct merupakan struktur atau class.
6. Return 0 merupakan nilai balik suatu fungsi.
7. Cout berfungsi untuk menampilkan hasil output atau keluaran ke layar.
8. Cin berfungsi untuk menginputkan atau memasukan data.
9. Endl berfungsi untuk membuat baris baru atau new line sama seperti \n.
10
10. struct nod{
struct nod *left;char data;struct nod *right;
};
Merupakan listing program tipe data abstrak struct dengan nama nod,
dimana tipe data dan variabel yang di deklarasikan adalah struct, char
untuk karakter, pointer left dan right sebagai tempat penampungan atau
penyimpanan sementara yang nantinya akan dipanggil.
11. typedef struct nod NOD;typedef NOD POKOK;
merupakan tipe data abstrak typedef struct dimana nama structnya adalah
nod. Typedef merupakan tipe data abstrak dimana NOD merupakan tipe
data lama dan POKOK adalah tipe data baru.
12. NOD *NodBaru(char item){
NOD *n;n=(NOD *) malloc (sizeof(NOD));if(n !=Nil){
n->data=item;n->left=Nil;n->right=Nil;
}return n;
}
Merupakan listing program yang berfungsi untuk membuat node baru
dimana tipe datanya adalah NOD dengan variabel NodBaru sebagai
pointer serta variabel item bertipe char atau karakter.
13. void BinaPokok(POKOK **T){
*T=Nil;}
Merupakan fungsi void bernama BinaPokok dengan variabel T sebagai
pointer yang bertipe data POKOK. Variabel T diberi value Nil.
14. Void TambahNod berfungsi untuk menambah node.
11
15. Void preOrder berfungsi untuk menampilkan data yang telah ditambahkan
dalam suatu node akar (root) dan node daun (leaf).
16. Void inOrder berfungsi untuk menampilkan data yang telah ditambahkan.
17. Void postOrder berfungsi untuk menampilkan data. Data yang ditampilkan
pertama yaitu data yang paling terakhir ditambahkan (FIFO).
18. POKOK merupakan tipe data abstrak dengan variabel keluarga yang
berfungsi sebagai pointer.
19. Char buah merupakan tipe data karakter dengan variabel buah.
20. TambahNod(&kelapa, buah=’M’ merupakan pemanggilan prosedur
tambah pada main program atau program utama dengan pembentukan
node baru sebagai root atau akar dimana variabel buah diberikan value M
yang nantinyaberfungsi sebagai output atau keluaran.
21. TambahNod(&kelapa, buah=’E’ merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
sebagai anak dari root ke arah kiri, dimana variabel buah diberikan value E
yang nantinya berfungsi sebagai output atau keluaran.
22. TambahNod(&kelapa, buah=’I’ merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
sebagai anak dari root ke arah kiri lalu kanan, dimana variabel buah
diberikan value I yang nantinya berfungsi sebagai output atau keluaran.
23. TambahNod(&kelapa, buah=’L’ merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
sebagai anak dari root ke arah kanan, dimana variabel buah diberikan
value L yang nantinya berfungsi sebagai output atau keluaran.
24. TambahNod(&kelapa, buah=’O’ merupakan pemanggilan prosedur
tambah pada main program atau program utama dengan pembentukan
node baru sebagai anak dari root ke arah kanan, dimana variabel buah
diberikan value O yang nantinya berfungsi sebagai output atau keluaran.
25. TambahNod(&kelapa, buah=’D’ merupakan pemanggilan prosedur
tambah pada main program atau program utama dengan pembentukan
node baru sebagai anak dari root ke arah kanan lalu kiri, dimana variabel
12
buah diberikan value D yang nantinya berfungsi sebagai output atau
keluaran.
26. preorder(kelapa) merupakan pemanggilan prosedur preorder pada main
program atau program utama
27. inorder(kelapa) adalah pemanggilan prosedur inorder pada main program
atau program utama.
28. postorder(kelapa) adalah pemanggilan prosedur inorder pada main
program atau program utama.
2. Tugas Praktikum
Pada bab ini, penulis akan membahas tugas praktikum yang
diberikan oleh dosen tentang listing program tree.
Listing Program Tree
/* * Program-Tree(Tugas_Root).cpp * * Created on: Sep 19, 2014 * Author: home
*/
#include <iostream>#include <conio.h>#include <malloc.h>#define Nil NULLusing namespace std;
struct nod{
struct nod *kiri;char data;struct nod *kanan;
};
typedef struct nod NOD;typedef NOD POKOK;
NOD *NodBaru(char item){
NOD *n;n=(NOD *) malloc (sizeof(NOD));if(n !=Nil){
13
n->data=item;n->kiri=Nil;n->kanan=Nil;
}return n;
}
void BinaPokok(POKOK **T){
*T=Nil;}
typedef enum {FALSE=0, TRUE=1} BOOL;
BOOL PokokKosong(POKOK *T){
return((BOOL)(T==Nil));}
void TambahNod(NOD **p, char item){
NOD *n;n=NodBaru(item);*p=n;
}
void preOrder(POKOK *T){
if(!PokokKosong(T)){
cout<<" "<<T->data;preOrder(T->kiri);preOrder(T->kanan);
}}
void inOrder(POKOK *T){
if(!PokokKosong(T)){
inOrder(T->kiri);cout<<" "<<T->data;inOrder(T->kanan);
}}
void postOrder(POKOK *T){
if(!PokokKosong(T)){
postOrder(T->kiri);postOrder(T->kanan);cout<<" "<<T->data;
}}
14
int main(){
POKOK *keluarga;char A[20], B[20], C[20], D[20], E[20], F[20], G[20];
BinaPokok(&keluarga);TambahNod(&keluarga, A[20]);TambahNod(&keluarga->kiri, B[20]);TambahNod(&keluarga->kanan, C[20]);TambahNod(&keluarga->kiri->kiri, D[20]);TambahNod(&keluarga->kiri->kanan, E[20]);TambahNod(&keluarga->kanan->kiri, F[20]);TambahNod(&keluarga->kanan->kanan, G[20]);
cout<<"Masukan nama kakek: ";cin>>A;cout<<endl;
cout<<"Masukan nama ayah: ";cin>>B;cout<<endl;
cout<<"Masukan nama om: ";cin>>C;cout<<endl;
cout<<"Masukan nama anda: ";cin>>D;cout<<endl;
cout<<"Masukan nama adik: ";cin>>E;cout<<endl;
cout<<"Masukan nama saudara pertama: ";cin>>F;cout<<endl;
cout<<"Masukan nama saudara kedua: ";cin>>G;cout<<endl;
cout<<"Tampilan secara PreOrder: ";preOrder(keluarga);cout<<endl;cout<<"Tampilan secara InOrder: ";inOrder(keluarga);cout<<endl;cout<<"Tampilan secara PostOrder: ";postOrder(keluarga);cout<<endl;cout<<endl;
15
return 0;}
Hasil Output Program Tree
Penjelasan Program Tree
1. #include merupakan pengarah preprocessor yang berfungsi untuk
menginstruksikan compiler untuk menyertakan berkas C++ sebelum di
compile.
2. <iostream> adalah sebuah library yang berfungsi untuk memanggil library
C++. Library iostream berfungsi untuk input dan output (cin dan cout).
3. Using namespace std merupakan standart device.
4. main merupakan badan fungsi atau fungsi utama.
5. Struct merupakan struktur atau class.
6. Return 0 merupakan nilai balik suatu fungsi.
7. Cout berfungsi untuk menampilkan hasil output atau keluaran ke layar.
8. Cin berfungsi untuk menginputkan atau memasukan data.
9. Endl berfungsi untuk membuat baris baru atau new line sama seperti \n.
10. struct nod{
struct nod *kiri;
16
char data;struct nod *kanan;
};
Merupakan listing program tipe data abstrak struct dengan nama nod,
dimana tipe data dan variabel yang di deklarasikan adalah struct, char
untuk karakter, pointer kiri dan kanan sebagai tempat penampungan atau
penyimpanan sementara yang nantinya akan dipanggil.
11. typedef struct nod NOD;typedef NOD POKOK;
merupakan tipe data abstrak typedef struct dimana nama structnya adalah
nod. Typedef merupakan tipe data abstrak dimana NOD merupakan tipe
data lama dan POKOK adalah tipe data baru.
12. NOD *NodBaru(char item){
NOD *n;n=(NOD *) malloc (sizeof(NOD));if(n !=Nil){
n->data=item;n->kiri=Nil;n->kanan=Nil;
}return n;
}
Merupakan listing program yang berfungsi untuk membuat node baru
dimana tipe datanya adalah NOD dengan variabel NodBaru sebagai
pointer serta variabel item bertipe char atau karakter.
13. void BinaPokok(POKOK **T){
*T=Nil;}
Merupakan fungsi void bernama BinaPokok dengan variabel T sebagai
pointer yang bertipe data POKOK. Variabel T diberi value Nil.
14. Void TambahNod berfungsi untuk menambah node.
15. Void preOrder berfungsi untuk menampilkan data yang telah ditambahkan
dalam suatu node akar (root) dan node daun (leaf).
16. Void inOrder berfungsi untuk menampilkan data yang telah ditambahkan. 17
17. Void postOrder berfungsi untuk menampilkan data. Data yang ditampilkan
pertama yaitu data yang paling terakhir ditambahkan (FIFO).
18. POKOK merupakan tipe data abstrak dengan variabel keluarga yang
berfungsi sebagai pointer.
19. A[20] merupakan variabel A dengan elemen 10 atau bisa disebut sebagai
array. Angka 20 adalah angka dimana batas maksimal jumlah karakter
yang bisa diinputkan oleh user.
20. TambahNod(&keluarga, A[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama. Di sini A sebagai root.
21. TambahNod(&keluarga->kiri, B[20]) merupakan pemanggilan prosedur
tambah pada main program atau program utama dengan pembentukan
node baru ke arah kiri dari root.
22. TambahNod(&keluarga, C[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
ke arah kanan dari root.
23. TambahNod(&keluarga, D[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
ke arah kiri kemudian bercabang lagi ke arah kiri dari root.
24. TambahNod(&keluarga, E[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
ke arah kiri kemudian bercabang lagi ke arah kanan dari root.
25. TambahNod(&keluarga, F[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
ke arah kanan kemudian bercabang lagi ke arah kiri dari root.
26. TambahNod(&keluarga, G[20]) merupakan pemanggilan prosedur tambah
pada main program atau program utama dengan pembentukan node baru
ke arah kanan kemudian bercabang lagi ke arah kanan dari root.
27. preorder(keluarga) merupakan pemanggilan prosedur preorder pada main
program atau program utama
28. inorder(keluarga) adalah pemanggilan prosedur inorder pada main
program atau program utama.
18
29. postorder(kelapa) adalah pemanggilan prosedur inorder pada main
program atau program utama.
BAB III
KESIMPULAN
19
Dari program di atas, output program pada latihan praktikum tidak
memunculkan huruf L. Hal ini disebabkan karena pada main program, proses
pemanggilan dari huruf L dan O memiliki struktur node yang sama yaitu right,
sehingga program tidak bisa membaca atau menampilkan huruf L. Program
sebenarnya dapat membaca huruf L, tetapi karena struktur node dari huruf O
adalah sama yaitu right, maka huruf L tertimpa oleh huruf O, sehingga hasil
output atau keluarannya adalah huruf M, E, I, O, D saja.
Untuk menampilkan huruf L, harus mengubah struktur dari node, bahkan
semua node, agar jangan sampai huruf yang satu tertimpa dengan huruf yang lain.
Hal ini bisa menyebabkan output program tidak sesuai dengan apa yang
seharusnya ditampilkan.
Di dalam program tugas praktikum, user seharusnya bisa melihat output
dari inorder, preorder dan postorder. Kenyataannya, tampilan hasil dari inorder,
preorder dan postorder hanya berupa simbol-simbol. Penulis mencoba mengubah
tipe data dari tipe data char menjadi string. Untuk mengubah tipe data, tidak dapat
mengubah hanya beberapa tipe data saja, tetapi harus diubah secara keseluruhan.
Misalnya ingin mengganti tipe data char menjadi string, maka dalam satu program
tersebut harus diubah menjadi string semua, jika tidak, maka akan eror.
Tipe data dalam program tugas praktikum telah diubah menjadi string,
tetapi output tulisan postorder, inorder dan preorder tidak dapat muncul. Program
langsung berhenti pada output “Masukan nama saudara kedua: ” setelah itu
muncul pemberitahuan bahwa program tidak dapat dijalankan dan harus menutup
program eclipse. Untuk mengatasi hal ini, struktur node, tipe data serta
pemanggilan seharusnya bisa diperbaiki atau diubah agar output pada postorder,
inorder dan preorder tidak hanya muncul simbol-simbol saja tetapi keluaran dari
inputan user.
BAB IV
DAFTAR PUSTAKA
20
Ardhana, YM Kusuma. 2013. Struktur Data dalam Ilustrasi Eclips Indigo C ++.
Yogyakarta: CAPS (Center of Academic Publishing Service).
Kristanto, Andri. 2003. Struktur Data Dengan C++. Yogyakarta: Graha Ilmu.
Kadir, Abdul. 2012. Buku Pintar C++ untuk Pemula. Jakarta: MediaKom
21