Eksperimen Algoritma dan Struktur Data I

Program Studi S1 ELINS
Laporan Eksperimen Algoritma dan Struktur Data II
Pohon Biner

NAMA : ADE SUHADA
NIM

:13/349135/PA/15504

TANGGAL PRAK. : 19 November 2014

Lab. Elekronika Dasar dan Instrumentasi Dasar
Jurusan Ilmu Komputer dan Elektronika
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Gadjah Mada
Yogyakarta
2014

I.
II.


III.

Judul
Pohon Biner
Tujuan
1. Memahami pohon biner sebagai struktur data dinamis
2. Memahami teknik pembacaan pohon biner
3. Memahami perancangan dan operasi dasar pada pohon biner
Landasan Teori
Pohon Biner
Dalam ilmu komputer, sebuah pohon biner (binary tree) adalah sebuah pohon struktur
data dimana setiap simpul memiliki paling banyak dua anak. Secara khusus anaknya
dinamakan kiri dan kanan. Penggunaan secara umum pohon biner adalah Pohon biner
terurut, yang lainnnya adalah heap biner.
Sebuah pohon biner berakar (rooted binary tree) adalah sebuah pohon berakar dimana setiap
simpul paling banyak mempunyai dua anak
Sebuah pohon biner penuh (full binary tree), atau pohon biner asli (proper binary tree), adalah
sebuah pohon dimana setiap simpul mempunyai nol atau dua anak.
Sebuah pohon biner sempurna (perfect binary tree) (atau kadang-kadang pohon biner lengkap
(complete binary tree) adalah sebuah pohon biner penuh dimana semua daun memiliki

kedalaman yang sama.
Sebuah pohon biner lengkap (complete binary tree) dapat didefinisikan juga sebagai sebuah
pohon biner penuh dimana semua daunnya memiliki kedalaman n atau n-1 untuk beberapa n.
Agar sebuah pohon dapat menjadi sebuah pohon biner lengkap, semua anak pada tingkat
terakhir harus menempati titik terkiri secara teratur, dengan tidak ada titik yang menganggur di
antara keduanya. Sebagai contoh, jika dua simpul pada tingkat terbawah masing-masing
menempati sebuah titik dengan suatu titik kosong di antara keduanya, tetapi sisa simpul
anaknya terhimpit tanpa titik di antaranya, maka pohon tersebut tidak dapat membentuk sebuah
pohon biner lengkap karena titik kosong tersebut.
Sebuah pohon biner lengkap berakar (rooted complete binary tree) dapat dikenali dengan
magma bebas.
Sebuah pohon biner hampir lengkap (almost complete binary tree) adalah sebuah pohon diaman
setiap simpul yang mempunyai anak kanan juga memiliki anak kiri. Memiliki anak kiri tidak
memerlukan sebuah simpul untuk mempunyai anak kanan. Penjelasan lainnya, sebuah pohon
biner hampir lengkap adalah sebuah pohon dimana untuk sebuah anak kanan, selalu terdapat
anak kiri, tetapi untuk sebuah anak kiri, tidak selalu terdapat sebuah anak kanan.
Jumlah simpul n dalam pohon biner lengkap dapat dihitung dengan menggunakan rumus: n =
2^(h+1)-1 dimana h adalah tinggi dari pohon.
Jumlah daun n dalam sebuah pohon biner lengkap dapat dihitung dengan menggunakan rumus:
n = 2^h dimana h adalah tinggi dari pohon.

Terdapat sebuah pemetaan satu-satu antara pohon terurut general dan pohon biner, yang
biasanya digunakan oleh Lisp untuk menggambarkan pohon terurut general sebagai pohon
biner. Setiap simpul N dalam pohon terurut terhubung ke sebuah simpul N dalam pohon biner;
anak kiri dari N merupakan simpul yang terhubung ke anak pertama dari N, dan anak kanan

dari N merupakan simpul yang terhubung ke saudara selanjutnya dari N yang merupakan
simpul selanjutnya dalam urutan di antara anak-anaknya dari ayahnya N
Suatu cara untuk menyelesaikan ini adalah bahwa setiap anak simpul berada dalam sebuah
linked list, dihubungkan bersama dengan bidang kanan mereka, dan simpul yang hanya
memiliki sebuah petunjuk ke awalnya atau kepala dari daftar ini, melalui bidang kiri nya.
Sebagai contoh, dalam sebuah pohon bagian kirinya, A memiliki 6 anak {B,C,D,E,F,G}. Ini
dapat diubah manjadi sebuah pohon biner bagian kanan.

Pohon biner dapat dianggap sebagai pohon asli yang membujur kesamping, dengan tepi kirinya
yang berwarna hitam menggambarkan anak pertama dan tepi kanannya yang berwarna biru
menggambarkan saudara selanjutnya. Daun dari bagian kiri pohon ini dapat dituliskan dalam
Lips sebagai:
(((M N) H I) C D ((O) (P)) F (L))
yang akan diimplementasikan ke memori sebagai pohon biner kanan, tanpa huruf apapun pada
simpul itu yang telah memiliki anak.


IV.

Flowchart
1. Flowchart untuk deklarasi Node
Start *Node
Declaration :
Integer Data
Node *kiri,
Node *kanan
Stop *Node

2. Flowchart untuk membuat Root
Start *buatNode(int kunci)
Node *temp;
Temp=new node;
temp->data=kunci;
temp->kiri=NULL;
temp->kanan=NULL;
return Temp;

Stop *buatNode(int kunci)

3. Flowchart untuk menyisipkan Daun
Start *sisipDaun(node *root, int
kunci)
Root=
=NULL
buatNode(kunci)
Kunci<
root->data
Root->kanan = sisipDaun
(root->kiri, kunci)

Root->kiri = sisipDaun
(root->kiri, kunci)

nci)

nci)


return root;

Stop *sisipDaun(node *root, int kunci)

4. Flowchart untuk menghitung Daun
Start hitungDaun(node *root)
NB :
A : root->kiri==NULL && root->kanan == NULL
B : hitung = hitungDaun(root->kiri) + hitungDaun(root->kanan)

Declaration :
integer hitung;

Root=
=NULL
A
B
A

return root;

Stop hitungDaun(node *root)

5. Flowchart untuk menghitung Node
Start hitungNode(node *root)
Declaration :
integer hitung =0

Root
!=NUL
L

D

Stop hitungNode(node *root)
NB : D = 1 + hitungNode(root->kiri) + hitungNode(root->kanan)

Hitung = 1

6. Flowchart untuk menampilkan data secara inorder
Start tampilInorder(node *root)


Root
!=NUL
L

A

Print root->data
B

Stop tampilInorder(node *root)

NB :
A : tampilInorder(root->kiri)
B : tampilInorder(root->kanan)
7. Flowchart untuk menampilkan data secara preorder
Start tampilPreorder(node *root)

Root
!=NUL

L

Print root->data
A
B

Stop tampilPreorder(node *root)
NB :
A : tampilPreorder(root->kiri)
B : tampilPreorder(root->kanan)

8. Flowchart untuk mnampilkan data secara postorder

Start tampilPostorder(node *root)

Root
!=NUL
L

A

B

NB :
A : tampilPostorder(root->kiri)
B : tampilPostorder(root->kanan)

Print root->data

Stop tampilPostorder(node *root)

V.

Listing Program
1. Listing Program untuk Node
struct node
{
int data;
node *kiri;
node *kanan;
};

2. Listing program untuk membuat daun
node *buatNode (int kunci)
{
node *temp;
temp = new node;
temp->data = kunci;
temp->kiri = NULL;
temp->kanan = NULL;
return temp;
}

3. Listing program untuk menyisipkan daun
node *sisipDaun(node *root, int kunci)
{
if (root==NULL)
return buatNode(kunci);
else
{
if (kuncidata)
root->kiri = sisipDaun(root->kiri, kunci);
else
root->kanan = sisipDaun(root->kanan, kunci);
return root;
}
}
4. Listing program untuk menghitung daun
int hitungDaun(node *root)
{
int hitung=0;
if (root!= NULL)
if (root->kiri == NULL && root->kanan == NULL)
hitung = 1;
else
hitung = hitungDaun(root->kiri) + hitungDaun(root->kanan);
return hitung;
}
5. Listing program untuk menghitung Node
int hitungNode(node *root)
{
int hitung=0;
if (root != NULL)
hitung = 1 + hitungNode(root->kiri) + hitungNode(root->kanan);
return hitung;
}
6. Listing program untuk menampilkan data secara inorder
void tampilInorder (node *root)
{
if (root!=NULL)
{
tampilInorder(root->kiri);
cout data kiri);
tampilPostorder(root->kanan);
cout data kiri,kunci);
else if (kunci > root->data)
root->kanan=hapusNode(root->kanan,kunci);
else
{
node *temp1, *temp2;
if(root->kiri!=NULL)
{
temp1 = root->kiri;
if(temp1->kanan==NULL)
{
root->data = temp1->data;

root->kiri = temp1->kiri;
}
else
{
while (temp1->kanan!=NULL)
{
temp2=temp1;
temp1=temp1->kanan;
}
root->data=temp1->data;
temp2->kanan=temp1->kiri;
}
}
else
{
temp1=root;
root = root->kanan;
}
free(temp1);
}
return root;
}
}

10. Listing program untuk menghapus data keseluruhan
void HapusData (node *root)
{
Node *temp;
if (root!=NULL)
{
HapusData(root->kiri);
HapusData(root->kanan);
}
Free(temp);
}

VI.

Hasil
1. hasil compile program untuk :
a. menampilkan data secara inorder
b. menampilkan data secara preorder
c. menampilkan data secara posorder
d. menghitung banyak daun
e. menghitung banyak node
f. menghapus data yang dinginkan

Gambar 1. Hasil compile program 1
2. hasil compile program menampilkan bentuk urutan data preorder dan postorder

Gambar 2. Hasil compile program 2

VII.

Pembahasan
Program pertama digunakan untuk menyisipkan data, menampilkan data secara inorder,
preorder dan juga postorder. Selain itu program pertama digunakan untuk menghitung
banyaknya daun, banyaknya node, dan juga digunakan untuk menghapus node yang
dinginkan. Pertama program akan membuat suatu node, node pertama ini merupakan root
pertama. Kemudian dilakukan penyisipan sebanyak 5 buah, yaitu 12, 34, 67, 89, dan 90.
Sehingga ketika program pertama di compile, maka untuk tampilan inorder adalah : 5, 12, 34,
67, 89, 90. Dimana pertama kali yang ditampilkan adalah node data bagian kiri node, setelah
itu node nya yang ditampilkan, dan yang terakhir adalah data pada bagia kanan node.
Sedangkan untuk tampilan data secara preorder, yang ditampilkan pertama adalah data pada
bagian kiri node, kemudian data pada bagian kanan node, setelah itu node nya yang
ditampilkan. Sehingga untuk tampilan data secra preorder adalah : 5, 12, 34, 67, 89 dan 90.
Sedangkan tampilan data secara postorder adalah , pertama yang ditampilkan adalah data
pada bagian kiri node, kemudian data pada bagian kanan node, dan yang terakhir adalah node
itu sendiri. Sehingga urutan data untuk postorder adalah : 90, 89, 67, 34, 12 dan 5. Selain itu
program untuk menghapus data adalah dengan memasukan nilai yang ingin dihapus,
kemudian mencarinya pada data, apabila data kunci atau data yang akan dihapus sama
dengan node, maka penghapusan selesai. Apabila data kunci lebih besar dari node, maka akan
dicari data yang ingin dihapus pada bagian kanan node dan seterusnya, sedangkan apabila
data kunci lebih kecil dari node, maka data yang akan dihapus dicari pada bagian kiri node,
dan seterusnya. Pada program diatas, contoh data yang akan dihapus adalah 12, sehingga
data pada pohon biner setelah dihapus tinggalah 5, 34, 67, 89 dan 90. Pada program pertama
ini, dapat diketahui banyaknya daun hanyalah 1, sedangkan banyaknya node adalah 6.
Pada program kedua merupakan kegiatan latihan 2. Yang digunakan untuk memandingkan
urutan data secara preorder dan juga secara postorder. Data pada pohon biner terurut secara
Preorder adalah : 5,2,1,4,3,10,8,6,9,11. Sedangkan urutan data secara postorder adalah :
1,3,4,2,6,9,8,11,10,5. Selain itu, untuk melakukan penghapusan seluruh data dilakukan
dengan cara melepas semua data (free) mulai dari data pada bagian kanan kiri node,
kemudian data pada bagian kanan node dan kemudian data pada node, sehingga semua data
dapat terlepas dari pohon biner.

VIII.

Kesimpulan
1. Pohon biner (binary tree) merupakan salah satu struktur data dinamis sama halnya
seperti linked list.
2. Pengurutan data pada pohon biner dapat dilakukan secara inorder,preorder dan juga
postorder.
3. Pengurutan data secara preorder dilakukan dengan logika :
a. Menampilkan data pada node.
b. Menampilkan data pada sebelah kiri node.
c. Menampilkan data pada sebelah kanan node.

4. Pengurutan data secara postorder dilakukan dengan logika :
a. Menampikan data pada bagian kiri node.
b. Menampilkan data pada bagian kanan node.
c. Menampilkan data pada node.
5. Pengurutan data secara inorder dilakukan dengan logika :
a. Menampilkan data pada bagian kiri node.
b. Menampilkan data pada node.
c. Menampilkan data pada bagian kanan node.
6. Penghapusan data pada pohon biner dapat dilakukan secara terpilih staupun secara
keseluruhan.
IX.

Daftar pustaka
Wikipedia. ͞ Pohon Biner͟. Diakses dari :
http://id.wikipedia.org/wiki/Pohon_biner#Definisi_untuk_pohon_berakar. Pada 25
November 2014.

X.

Lampiran
Laporan sementara