Top 4 (Tree)

Anda mungkin juga menyukai

Anda di halaman 1dari 11

PRAKTIKUM ASD

TOPIK 6
TREE (POHON)
I. Tujuan
Mahasiswa dapat memahami konsep dari tree.
Mahasiswa dapat mengaplikasikannya dalam program.
II. Alat yang dibutuhkan
1 set computer
III.Dasar Teori
Definisi Tree
Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree biasa
didefinisikan sebagai kumpulan simpul atau node dengan satu elemen khusus yang disebut Root.
Node lainnya terbagi menjadi himpunan-himpunan yang saling tak berhubungan satu sama
lain(disebut Subtree). Untuk lebih jelasnya, di bawah ini akan diuraikan istilah-istilah umum
dalam tree:
Predecessor
Successor
Ancestor
Descendant
Parent
Child
Sibling
Subtree
Size
Level
Height
Root
Leaf
Degree

Node yang berada di atas node tertentu


Node yang berada di bawah node tertentu
Seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang
sama
Seluruh node yang terletak sesudah node tertentu dan terletak pada jalur yang
sama
Predecessor satu level di atas suatu node
Successor satu level di bawah suatu node
Node-node yang memiliki parent yang sama dengan suatu node
Bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki
semua karakteristik dari tree tersebut
Banyaknya node dalam suatu tree
Level dari root adalah 0, dan level node lainnya adalah 1 level lebih dari parentnya
Banyaknya tingkatan/level dalam suatu tree
Satu-satunya node khusus dalam tree yang tidak memiliki successor
Node-node dalam tree yang tidak memiliki successor
Banyaknya child yang dimiliki suatu node

Gambar 1. Contoh gambar tree


Ancestor ( F )
Descendant ( C )
Parent ( D )
Child (A)
Sibling ( F )
Size
Level(B)
Height
Root
Leaf
Degree ( C )

= C,A
= F,G
=B
= B,C
=G
=7
=1
=2
=A
= D, E ,F ,G
=2

Binary Tree

Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal
dua subtree dan kedua subtree tersebut harus terpisah. Sesuai dengan definisi tersebut, tiap node
dalam binary search tree hanya boleh memiliki paling banyak dua child. Berikut contohnya:

Gambar 2. Contoh Binary Tree.


Rumus untuk menghitung Level minimum suatu binary tree dengan N data adalah floor dari
Log2(N). Level dimulai dari 0. Log menggunakan basis 2 karena yang dibahas di sini adalah
binary tree yang hanya dapat memiliki maksimum 2 child. Jika tree mempunyai maksimum 3
child maka basis log yang digunakan 3.
Jenis-jenis Binary Tree:
Full Binary Tree
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree harus
mempunyai panjang path yang sama. Berikut contohnya:

Gambar 3. Contoh Full Binary Tree.


Complete Binary Tree
Jenis ini mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang path yang
berbeda dan setiap node kecuali leaf memiliki 2 child. Berikut contohnya:

Gambar 4. Contoh Complete Binary Tree

Skewed Binary Tree


Skewed Binary Tree adalah Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki satu
child. Berikut contohnya:

Gambar 5. Contoh Skewed Binary Tree.

Binary Search Tree

Binary Tree ini memiliki sifat di mana semua left child harus lebih kecil daripada right
child dan parentnya. Semua right child juga harus lebih besar dari left child serta parent-nya.
Binary search tree dibuat untuk mengatasi kelemahan pada binary tree biasa yaitu kesulitan
dalam searching/pencarian node tertentu dalam binary tree.
Untuk lebih jelasnya, dapat dilihat gambar berikut.

Gambar 6. Contoh Binary Tree dengan data-datanya


Komponen utama dari binary search tree adalah: data, pointer yang menunjuk ke anak (kiri dan
kanan) dan pointer yang menunjuk ke node parent.
Pada binary search tree , node yang pertama kali dibentuk akan menjadi akar/root (Pada contoh
diatas root=18). Setiap node yang akan ditambahkan pada binary search tree harus melalui
pengecekan terlebih dahulu bahwa data yang baru tersebut akan diletakkan di mana pada binary
search tree. Setiap nilai data yang lebih kecil harus berada di sebelah kiri dan nilai data yang
lebih besar harus berada di sebelah kanan. Data yang dimasukkan tidak boleh sama.
Contoh deklarasi struktur untuk membuat binary search tree:
struct tree
{
char data;
tree *left;
tree *right;
tree *parent;
}*root,*node;

Koding 1. Membuat Struct Tree.

Struktur binary tree telah dibuat dengan deklarasi di atas. Tetapi itu semua hanya cetakannya
saja. Isi dari struktur tersebut belum di tentukan. Di bawah ini adalah potongan code untuk
membentuk akar (root) pada binary search tree:
void makeRoot (char data)
{
node=new tree;
node->left=NULL;
node->right=NULL;
node->parent=NULL;
node->data=data;
if(root==NULL)
{
//jika root belum ada, jadikan root
root=node;
}
else
{
printf(Root sudah ada!!!);
}
}

Koding 2. Membuat Root atau Akar.


Sampai langkah ini, root telah terbentuk tanpa node-node di bawahnya. Sebuah root saja belum
dapat dikatan sebagai sebuah tree. Oleh sebab itu, node masih harus ditambahkan dengan
menyertakan fungsi sebagai berikut:
void addNode(tree *ancestor, char data)
{
/////////////////INI PROGRAM MAKE ROOT DIATAS//////////////
if(root==NULL)
{
//jika root belum ada, jadikan root
root=node;
}
///////////////////////////////////////////////////////////
///////////////TRUS DITAMBAHIN INI BUAT ADD NODE///////////
else if(data==ancestor->data)
{
//Data ga boleh kembar
printf(Data sudah ada!!!);
}
else
{
node=new tree;
node->left=NULL;
node->right=NULL;
node->parent=NULL;
node->data=data;
//char data!!! Kalau string pake strcpy
if(data < ancestor->data)
{
//jika data lebih kecil dari ancestor, letakkan di kiri
if(ancestor->left==NULL)
{
//jika di kiri kosong, letakkan disitu
ancestor->left=node;
node->parent=ancestor;
}
else
{
//jika ada isinya, tambahkan di kirinya lagi
delete node;
//supaya memori tidak penuh
addNode(ancestor->left,data);
}
}
else
{
//data lebih besar dari ancestor, letakkan di kanan
if(ancestor->right==NULL)
{
//jika di kanan kosong, letakkan di situ
ancestor->right=node;
node->parent=ancestor;
}
else

}
}

//jika ada isinya, tambahkan di kanannya lagi


delete node;
//supaya memori tidak penuh
addNode(ancestor->right,data);

Koding 3. Menambahkan Node.


Cara menggunakan fungsi diatas adalah:
addNode(root,data);
Data adalah nilai node baru yang akan dimasukkan ke dalam tree. Dan root adalah akar
bertipe struct tree diatas. Maka dengan memasingkan data dan root, artinya program diatas akan
mencari lokasi yang tepat untuk data yang dimasukkan, dimulai dari root.
Program akan mengecek apakah data lebih besar atau lebih kecil daripada root. Jika root
belum ada (root==NULL), maka node baru tersebut akan dijadikan sebagai rootnya. Jika root
sudah ada nilainya, dicek apakah data baru tersebut lebih besar atau lebih kecil daripada root.
Jika lebih kecil, maka akan dicek node anak pada sebelah kiri root, sedangkan jika lebih besar,
maka akan dicek node anak pada sebelah kanan root.
Kemudian program akan mencari terus sampai ditemukan bagian tree yang paling ujung
dengan prinsip sama seperti diatas tadi (lebih besar dari node diletakkan menjadi anak sebelah
kanan, lebih kecil dari node diletakkan menjadi anak sebelah kiri).
Untuk membentuk sebuah binary search tree potongan code di atas sudah cukup. Dengan
fungsi membuat root dan menambahkan node, binary search tree sudah terbentuk. Masalahnya
sekarang, setelah binary search tree sudah terbentuk bagaimana cara melihat tree tersebut? Ada
tiga cara untuk melihat isi dari binary search tree yaitu:

PreOrder
InOrder
PostOrder
Ketiga cara ini dilakukan dengan menggunakan Rekursi (Lihat lagi dasprog tentang rekursi).
PreOrder
Metode:
Kunjungi parent,jelajahi anak kiri jika ada. Setelah itu baru jelajahi
anak kanan jika ada
void viewPreOrder(tree *node)
{
if(node!=NULL)
{
//cetak data
printf(%c",node->data);
//ke kiri
if(node->left!=NULL) viewPreOrder(node->left);
//ke kanan
if(node->right!=NULL) viewPreOrder(node->right);
}
}

Koding 4. Melihat isi tree dengan metode view PreOrder.

InOrder
Metode:

jelajahi anak kiri, kunjungi parentnya lalu jelajahi anak kanan.

void viewInOrder(tree *node)


{
if(node!=NULL)
{
//ke paling kiri terus
if(node->left!=NULL) viewInOrder(node->left);
//cetak data
printf(%c",node->data);
//ke kanan
if(node->right!=NULL) viewInOrder(node->right);
}
}

Koding 5. Melihat isi tree dengan metode view InOrder.


PostOrder
Metode:
jelajahi anak kiri jika ada, lalu jelajahi anak kanan jika ada, lalu
baru kunjungi parent
void viewPostOrder(treeNode *node)
{
if(node!=NULL)
{
//ke kiri terus
if(node->left!=NULL) viewPostOrder(node->left);
//ke kanan
if(node->right!=NULL) viewPostOrder(node->right);
//cetak data
printf(%c",node->data);
}
}

Koding 6. Melihat isi tree dengan metode view PostOrder.

Gambar 7. Binary Search Tree.


PreOrder
InOrder
PostOrder

: 6,4,2,1,3,5,8,7,9,10 (parent, kiri,kanan)


: 1,2,3,4,5,6,7,8,9,10 (kiri,parent,kanan)
: 1,3,2,5,4,7,10,9,8,6 (kiri,kanan,parent)

Tree sudah dibuat dan dapat dilihat, Berikutnya adalah bagaimana cara mencari node yang di
inginkan.
tree* findNode(tree *T, char data)
{
if(T==NULL)return NULL;
if(data<T->data)return findNode(T->left,data);
else if(data>T->data)return findNode(T->right,data);
else
return T;
}

Koding 7. Mencari Node yang diinginkan.


Dan untuk mencari nilai node terkecil, berikut codingnya
tree* findMin(tree *T)
{
if(T==NULL)return NULL;
else if(T->left==NULL) return T;
else return findMin(T->left);
}

Koding 8. Mencari Node dengan nilai terkecil.


Selanjutnya koding untuk mencari nilai node terbesar.
tree* findMax(tree *T)
{
if(T!=NULL)
{
While(T->right!=NULL)T=T->right;
}
return T;
}

Koding 9. Mencari dengan nilai terbesar.


Dan yang terakhir, menghapus node. Contoh kasusnya seperti gambar dibawah:

Gambar 8. Menunjukan bagaimana delete bekerja.


Terdapat tree seperti gambar 8 sebelah kiri, dan node nomor 4 ingin di hapus, sehingga
menghasilkan tree seperti gambar 8 sebelah kanan. Berikut kodingnya:
tree* deleteNode(tree *T, char data)
{
tree *temp=NULL;
if(T==NULL)printf("Data tidak ditemukan!!");
else if(data<T->data)T->left=deleteNode(T->left,data);
else if(data>T->data)T->right=deleteNode(T->right,data);
else
{
if(T->left!=NULL && T->right!=NULL)
{
temp=findMin(T->right);
T->data=temp->data;
T->right=deleteNode(T->right,T->data);
}
else
{
temp=T;
if(T->left==NULL) T=T->right;
else if(T->right==NULL)T=T->left;
delete temp;
}
}
return T;
}

Coba program-program diatas di rumah/kos, siapa tau assisten sengaja membuat sedikit salah
pada handout ini. Coba juga program-program lain yang diajarkan pada handout kuliah dan
topik-topik sebelumnya terutama tentang operasi file, pointer dan linked list. Ketiga topik
tersebut akan digunakan terus pada topik mendatang.
IV. Percobaan
1. Membuat tree dan mencoba berbagai macam viewnya(pre,in dan post).

2. Mencoba mendelete node pada tree yang ada.

V. Langkah Percobaan

Gambar 9. Binary Search Tree untuk latihan percobaan.


1. Buatlah coding untuk membuat tree di atas
2. Inputkan angka-angka supaya terbentuk tree seperti diatas.
3. Buatlah metode viewnya yaitu pre-order, in-order dan post-order.
4. Cocokan hasil viewnya dengan hasil di bawah ini
Pre: 20,10,6,4,9,13,11,16,30,26,23,21,25,34,38,35,40
In: 4,6,9,10,11,13,16,20,21,23,25,26,30,34,35,38,40
Post: 4,9,6,11,16,13,10,21,25,23,26,35,40,38,34,30,20
Jika berbeda, kesalahan terdapat pada langkah 1, coba pelajari lagi coding pada addNode.
5. Setelah jawaban pre,in, dan postnya sama dengan langkah 3, coba hapus node :
dengan nilai 4, lalu print pre,in, dan post ordernya, lalu hapus node
dengan nilai 16, lalu print pre,in, dan post ordernya, lalu hapus node
dengan nilai 26, lalu print pre,in, dan post ordernya, lalu hapus node
dengan nilai 34, lalu print pre,in, dan post ordernya, lalu hapus node
rootnya, lalu print pre,in, dan post ordernya.
Tugas 1(Hard Copy):
1. Tuliskan urutan angka yang diinputkan supaya membentuk tree pada gambar 9.
2. Tuliskan hasil dari langkah percobaan nomor 4.
3. Di dasar teori terdapat rumus untuk menghitung level minimum dari sebuah tree yaitu
level = floor(Log2(N)). N adalah jumlah data. Cobalah untuk memasukkan 5 nilai N yang
berbeda dan lihat hasil level minimumnya. Apakah rumus level minimum sudah tepat?
4. Tuliskan coding percobaan

VI. Daftar Pustaka


Hand Out Praktikum ASD tahun lalu
Slide ASD topic tree dari dosen
By: 612006058
1st Edited by: 622009004
2nd Edited by: 612011052
3rd Edited by: 612013015

Anda mungkin juga menyukai