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
I. Judul
Pohon Biner II. Tujuan
1. Memahami pohon biner sebagai struktur data dinamis 2. Memahami teknik pembacaan pohon biner
3. Memahami perancangan dan operasi dasar pada pohon biner
III. 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.
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
2. Flowchart untuk membuat Root
3. Flowchart untuk menyisipkan Daun
Start *buatNode(int kunci)
Node *temp;
Stop *buatNode(int kunci) Temp=new node; temp->data=kunci;
temp->kiri=NULL; temp->kanan=NULL;
return Temp;
Start *sisipDaun(node *root, int kunci)
return root;
Stop *sisipDaun(node *root, int kunci) Root=
=NULL
Kunci< root->data
buatNode(kunci)
Root->kiri = sisipDaun (root->kiri, kunci)
nci) Root->kanan = sisipDaun
4. Flowchart untuk menghitung Daun
NB :
A : root->kiri==NULL && root->kanan == NULL
B : hitung = hitungDaun(root->kiri) + hitungDaun(root->kanan)
5. Flowchart untuk menghitung Node
NB : D = 1 + hitungNode(root->kiri) + hitungNode(root->kanan)
Start hitungDaun(node *root)
Root= =NULL
return root; Declaration : integer hitung;
A
Hitung = 1 B
A
Stop hitungDaun(node *root)
Start hitungNode(node *root)
Root !=NUL L Declaration : integer hitung =0
6. Flowchart untuk menampilkan data secara inorder
NB :
A : tampilInorder(root->kiri) B : tampilInorder(root->kanan)
7. Flowchart untuk menampilkan data secara preorder
NB :
A : tampilPreorder(root->kiri) B : tampilPreorder(root->kanan)
Stop tampilInorder(node *root) Start tampilInorder(node *root)
Root !=NUL
L A
B Print root->data
Stop tampilPreorder(node *root) Start tampilPreorder(node *root)
Root !=NUL
L
A
B
8. Flowchart untuk mnampilkan data secara postorder
NB :
A : tampilPostorder(root->kiri) B : tampilPostorder(root->kanan)
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;
}
Stop tampilPostorder(node *root) Start tampilPostorder(node *root)
Root !=NUL
L A
B
3. Listing program untuk menyisipkan daun node *sisipDaun(node *root, int kunci) {
4. Listing program untuk menghitung daun int hitungDaun(node *root)
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)
7. Listing program untuk menampilkan data secara Preorder void tampilPreorder (node *root)
{
8. Listing program untuk menampilkan data secara Postorder void tampilPostorder (node *root)
{
9. Listing program untuk menghapus data pada Node node *hapusNode(node *root,int kunci)
root->kiri = temp1->kiri;
10. Listing program untuk menghapus data keseluruhan void HapusData (node *root)
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
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.
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 :
X. Lampiran