Modul ke: 10 Fitrianingsih Fakultas FASILKOM ALGORITMA DAN STRUKTUR DATA JENIS-JENIS TREE SKom., MMSI Program Studi Sistem Informasi
JENIS-JENIS TREE
Pohon (Tree) adalah graf terhubung yang tidak mengandung sirkuit. Karena merupakan graf terhubung maka pada pohon selalu terdapat path atau jalur yang menghubungkan kedua simpul di dalam pohon
Sifat utama pohon berakar : Jika pohon mempunyai simpul sebanyak n, maka banyaknya ruas adalah (n- 1). Mempunyai simpul khusus yang disebut Root (Akar), jika simpul tersebut memiliki derajat keluar 0 dan derajat masuk = 0. Mempunyai simpul yang disebut Leaf (Daun), jika simpul tersebut memiliki derajat keluar = 0 dan derajat masuk = 1. Setiap simpul mempunyai tingkatan (level), dimulai dari root dengan level 0 sampai dengan level n pada daun yang paling bawah. Pohon mempunyai ketinggian (kedalaman / height) yaitu level tertinggi +1. Pohon mempunyai berat (bobot / weight) yaitu banyaknya daun pada pohon.
POHON BINAR (BINARY TREE) Pohon binar adalah himpunan simpul yang terdiri dari 2 subpohon (yang disjoint / saling lepas) yaitu subpohon kiri dan subpohon kanan. Setiap simpul dari pohon binar mempunyai derajat keluar maksimum = 2. Pendefinisian pohon binar bersifat rekursif.
Root adalah A Simpul yang mempunyai 2 anak adalah simpul A, B, C dan H. Simpul yang mempunyai 1 anak adalah simpul E dan J. Simpul yang tidak mempunyai anak disebut daun (terminal) adalah D, F, G, K dan L.
TERMINOLOGI PADA POHON BINAR Terminologi hubungan keluarga banyak digunakan dalam terminologi pada pohon binar. Misalnya istilah anak kiri dan anak kanan, untuk menggantikan suksesor kiri dan suksesor kanan, serta istilah ayah untuk pengganti predesesor.
K misalnya adalah keturunan kanan dari D, tetapi bukan keturunan dari F, E ataupun M. Simpul G adalah ayah dari K dan L. Di sini K dan L adalah bersaudara, masing-masing anak kiri dan anak kanan dari G. Garis yang ditarik dari Simpul N ke suksesor disebut Ruas dan sederetan ruas yang berturutan disebut Jalur atau path. Sebuah jalur yang berakhir pada daun (terminal) disebut Cabang. Garis AD maupun GL adalah contoh ruas. Barisan ruas (AD, DG, GL) adalah jalur dari simpul A ke simpul L, jalur tersebut merupakan cabang, karena berakhir di simpul terminal (daun ) L.
Dari contoh pohon binar : Root : A Simpul Daun adalah : F, K, L dan M Level 0 adalah simpul A Level 1 adalah simpul D dan E Level 2 adalah simpul F, G dan M Level 3 adalah simpul K dan L Ketinggian (kedalaman) = 3 + 1 = 4 Berat (bobot) = 4 Cabang (AD, DG, GK) ataupun (AD, DG, GL) mengandung simpul dengan jumlah maksimum, yakni = 4, sedangkan cabang (AE, EM) serta (AD, DF) hanya mengandung 3 simpul.
POHON BINAR LENGKAP Suatu pohon binar T dikatakan lengkap atau complete, bila setiap tingkatnya kecuali mungkin tingkat yang terakhir, mempunyai semua simpul yang mungkin, yakni 2 r simpul untuk tingkat ke-r, dan bila semua simpul pada tingkat terakhir muncul di bagian kiri pohon. Kita dapat memberi label pohon binar lengkap menggunakan integer 1, 2,, n dari kiri ke kanan generasi demi generasi. Hal ini untuk mempermudah kita untuk mengetahui ayah serta anak dari suatu simpul pada pohon binar lengkap. Dalam hal ini anak kiri dari simpul K adalah 2 * K dan anak kanan dari simpul K adalah 2*K+1. Sedangkan ayah dari K adalah INT(K/2). Notasi INT(P) adalah integer terbesar yang lebih kecil atau sama dengan P. Jadi INT(3 2/3) = 3, INT(15/2) = 7, INT(4) = 4, dan sebagainya.
POHON-2 Pohon Binar T dikatakan Pohon-2 atau pohon binar yang dikembangkan bila setiap simpul mempunyai 0 atau 2 anak. Dalam kasus ini, simpul dengan 2 anak disebut simpul internal, sedangkan simpul tanpa anak disebut simpul eksternal. Dalam diagram, seringkali diadakan pembedaan antara simpul internal dan eksternal. Simpul internal digambarkan sebagai lingkaran, sedangkan simpul eksternal sebagai bujursangkar.
Istilah-istilah umum dalam tree Predecessor : node yang berada di atas node tertentu Successor : node yang dibawah node tertentu Ancestor : seluruh node yang terletak sebelum node tertentu dan terletak sesudah pada jalur yang sama Descendant : seluruh node yang terletak sesudah node tertentu dan terletak sesudah pada jalur yang sama Parent : predecessor satu level diatas suatu node Child : successor satu level dibawah suatu node Sibling : node-node yang memiliki parent yang sama dengan suatu node Subtree : bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki semua karakteristik dari tree tersebut Size : banyaknya node dalam suatu tree Height : banyaknya tingkatan/level dalam suatu tree Root : satu-satunya node khusus dalam tree yang tidak mempunyai predecessor Leaf : node-node dalam tree yang tidak memiliki successor Degree : banyaknya child yang dimiliki suatu node
Contoh: Ancestor : C, A Descendant : C, G Parent : B Child : B, C Sibling : F, G Size : 7 Height : 3 Root : A Leaf : D, E, F, G Degree : 2
JENIS TREE
1. Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah. Maka tiap node dalam binary tree hanya boleh memiliki paling banyak dua child.
Jenis Binary Tree 1. Full Binary Tree Binary Tree yang tiap nodenya (kecuali leaf) memiliki dua child dan tiap sub tree harus mempunyai panjang path yang sama.
2. Complete Binary Tree Mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang path yang berbeda. Node kecuali leaf memiliki 0 atau 2 child.
3. Skewed Binary Tree Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki satu child.
Operasi Binary Tree Create : membentuk binary tree baru yang masih kosong Clear : mengosongkan binary tree yang sudah ada Empty : function untuk memeriksa apakah binary tree masih kosong Insert : memasukkan sebuah node ke dalam tree. Ada 3 pilihan insert, yaitu : root, left child, atau right child. Khusus insert sebagai root, tree harus dalam keadaan kosong. Find : mencari root, parent, left child, atau right child dari suatu node. Tree tidak boleh kosong. Update : mengubah isi dari node yang ditunjuk oleh pointer current. Tree tidak boleh kosong. Retrive : mengetahui isi dari node yang ditunjuk oleh pointer current. Tree tidak boleh kosong. DeleteSub : menghapus sebuah subtree (node beserta seluruh descedantnya) yang ditunjuk current. Tree tidak boleh kosong. Setelah itu pointer current akan berpindah ke parent dari node yang dihapus. Characteristic: mengetahui karakteristik dari suatu tree, yakni : size, height, serta average lengthnya. Tree tidak boleh kosong. Traverse : mengunjungi seluruh node pada tree, masing-masing sekali. Hasilnya adalah urutan informasi secara linear yang tersimpan dalam tree. Ada tiga cara traverse : Pre Order, InOrder, dan PostOrder.
Contoh-contoh operasi Binary tree
Langkah Traverse PreOrder : cetak isi node yang dikunjungi, kunjungi Left Child, kunjungi Right Child. InOrder : kunjungi Left Child, cetak isi node yang dikunjungi, kunjungi Right Child. PostOrder : kunjungi Left Child, kunjungi Right Child, cetak isi node yang dikunjungi.
2. Binary Search Tree Adalah binary tree dengan sifat bahwa semua left child harus lebih kecil daripada right child dan parentnya. Semua right child harus lebih besar dari left child serta parentnya. Binary Search Tree dibuat untuk mengatasi kelemahan pada binary tree biasa, yaitu kesulitan dalam searching/pencarian node tertentu dalam binary tree.
3. AVL Tree Adalah binary search tree yang memiliki perbedaan tingkat tinggi/level antara subtree kiri dan subtree kanan maksimal adalah 1. Dengan AVL Tree, waktu pencarian dan bentuk tree dapat dipersingkat dan disederhanakan. Selain AVL Tree terdapat juga Height Balanced n tree, yaitu binary search tree yang memiliki perbedaan level antara subtree kiri dan subtree kanan maksimal adalah n. Sehingga AVL Tree adalah Height Balanced 1 Tree.
Contoh Program //Program :tree.cpp #include <stdio.h> #include <malloc.h> 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!= NULL) { n->data = item; n->left = NULL; n->right = NULL; } return n; }
void BinaPokok(POKOK **T) { *T = NULL; } typedef enum { FALSE = 0, TRUE = 1} BOOL; BOOL PokokKosong(POKOK *T) { return((bool)(t == NULL)); } void TambahNod(NOD **p, char item) { NOD *n; n = NodBaru(item); *p = n; } void preorder(pokok *T) { if(!pokokkosong(t)) { printf("%c ", T->data); preorder(t->left); preorder(t->right); } }
void inorder(pokok *T) { if(!pokokkosong(t)) { inorder(t->left); printf("%c ", T->data); inorder(t->right); } } void postorder(pokok *T) { if(!pokokkosong(t)) { postorder(t->left); postorder(t->right); printf("%c ", T->data); } }
int main() { POKOK *kelapa; char buah; BinaPokok(&kelapa); TambahNod(&kelapa, buah = 'M'); TambahNod(&kelapa->left, buah = 'E'); TambahNod(&kelapa->left->right, buah = 'I'); TambahNod(&kelapa->right, buah = 'L'); TambahNod(&kelapa->right->right, buah = 'O'); TambahNod(&kelapa->right->right->left, buah = 'D'); printf("tampilan secara PreOrder: "); preorder(kelapa); printf("\ntampilan secara InOrder: "); inorder(kelapa); printf("\ntampilan secara PreOrder: "); postorder(kelapa); printf("\n\n"); return 0; }
SOAL LATIHAN : Buatlah program untuk menampilkan node baru ke dalam pohon dengan menggunakan prosedur preorder, inorder, dan postorder. Sehingga akan didapatkan hasil : Tampilan secara PreOrder : R A S I T E Tampilan secara InOrder : I S T A R E Tampilan secara PostOrder : I T S A E R
Terima Kasih Fitrianingsih, SKom., MMSI