Pemilihan struktur data yang akan digunakan bergantung pada beberapa faktor, yaitu :
1. Apa yang perlu disimpan? Struktur data tertentu akan cocok digunakan untuk jenis
data tertentu.
2. Biaya operasional (cost of operations). Contoh : mencari elemen pada list, lalu
menyimpan list tersebut ke dalam sorted array, dengan begitu kita dapat
menggunakan binary search.
3. Memory usage (penggunaan memori)
4. Ease of implementation (kemudahan implementasi), artinya kita menggunakan
struktur data tertentu karena mudah.
PERTEMUAN 10
TREE (POHON)
A. TREE (PENGENALAN)
Tree adalah salah satu struktur data yang digunakan untuk merepresentasikan data
hierarkis (Sesuai urutan dari atas ke bawah) dan merupakan cara yang efisien untuk
menyimpan dan mengorganisir data yang bersifat hierarkis. Contoh : struktur
organisasi yang menampilkan jabatan seorang pegawai.
Gambar tersebut adalah contoh organisasi hierarkis. Dalam perusahaan tersebut, John
sebagai CEO dan mempunyai 2 direksi pelapor yaitu Steve dan Rama. Steve
mempunyai 3 direksi pelapor yaitu Lee, Bob dan Ella. Steve juga dapat dikatakan
sebagai manager dari Lee, Bob, dan Ella. Rama mempunyai 2 direksi pelapor yaitu
Tom dan Raj. Rama juga dapat dikatakan sebagai manager dari Tom dan Raj. Begitu
juga dengan Bob mempunyai 2 direksi pelapor yaitu Sal dan Emma. Lalu, Tom
mempunyai 1 direksi pelapor yaitu Bill.
Definisi Tree sebagai Logical Model adalah sebagai kumpulan dari beberapa entitas
yang disebut Nodes (simpul) yang saling terhubung untuk meng-simulasikan bentuk
hierarkis.
Tree dapat dikatakan sebagai struktur data yang menggunakan teknik Rekursif. Tree
dapat didefinisikan secara rekursif sebagai struktur yang memiliki beberapa
node/simpul yang disebut root dan beberapa sub-trees. Dan susunan root dari tree
memiliki hubungan dengan root dari semua sub-trees yang ada.
Bagian-bagian pada Tree
Prodecessor Node yang berada diatas node tertentu
Successor Node yang berada dibawah node tertentu
Seluruh node yang terletak sebelum node
Ancestor
tertentu dan terletak pada jalur yang sama
Seluruh node yang terletak setelah node
Descendant
tertentu dan terletak pada jalur yang sama
Parent Prodecessor satu level diatas suatu node
Prodecessor satu level dibawah suatu
Child
node
Node-node yang memiliki parent yang
Sibling
sama dengan suatu node
Ukuran edges terpanjang dari Root ke
Height
Leaf node.
Depth Panjang edges dari root ke Node X
Edges 2 simpul yang terhubung
Leaf Node yang tidak memiliki child
Banyaknya child yang dimiliki suatu
Degree
node
Bagian paling atas Tree disebut Root. Setiap node pada Tree memiliki sebuah
data dan bisa bertipe data apa saja. Sebuah Node dapat berhubungan(link) dengan
node yang lain, node yang terhubung itu nantinya disebut sebagai children dari
Node tersebut.
Berdasarkan gambar Tree diatas, dapat dijelaskan bahwa : Root memiliki child
yaitu node 1,2,3. Node 1 memiliki child yaitu node 4,5,6. Node 2 memiliki child
yaitu node 7. Node 3 memiliki child yaitu node 8 dan 9, dst.
Hubungan antara node 4,5,6 adalah sibling karena mereka mempunyai parent
yang sama yaitu Node 1. sedangkan hubungan antara node 7 dengan 8 adalah
cousins, karena parent berbeda tetapi mempunyai grand parent sama yaitu Root.
Root adalah satu-satunya Node tanpa Parent.
Node yang tidak mempunyai child disebut Leaf Node atau eksternal node.
Contohnya adalah Node yang berwarna oranye pada gambar Tree diatas.
Node yang mempunyai child lebih dari sama dengan 1 disebut non-leaf node atau
internal node. Contohnya node yang berwarna putih pada gambar Tree diatas.
Depth dari node 1 ke node 15 adalah 4. Height dari root ke node 13 adalah 3.
Degree dari node 1 adalah 3, karena node 1 memiliki 3 child yaitu node 4,5,6.
Node 1 adalah ancestor node 4 dan node 4 adalah descendant node 1.
Pada tree hanya bisa berjalan satu arah, misal node 1 ke node 4 dapat dilakukan,
tetapi tidak sebaliknya, karena Tree hanya 1 arah yaitu dari atas ke bawah (Top to
the bottom)
N-Nodes Tree
Tree dengan n-Nodes, pasti akan memiliki n-1 edges. Semua nodes kecuali root akan
mempunyai 1 edge yang baru/akan masuk (incoming edges).
Binary Tree
Binary tree adalah tree yang setiap node nya maksmimal memiliki 2 child.
Cara yang paling umum untuk mengimplementasikan Tree adalah membuat nodes
yang terhubung secara dinamis dengan menggunakan pointers atau references, sama
seperti implementasi pada linked list.
Node mempunyai 3 fields. Field ditengah untuk menyimpan data, dan 2 field yang
tersisa untuk menyimpan alamat dari left child dan right child.
Pada program c/c++ dapat didefinisikan sbg berikut :
Pada Binary Tree, hanya terdapat 2 pointer pada program dikarenakan maksmial child
adalah 2, pointer pertama untuk menyimpan alamat left child dan sub-tree dibagian
kiri dan pointer ke 2 untuk menyimpan alamat right child. Definisi pointer pada node
tsb hanya berlaku pada binary tree.
B. BINARY TREE
Binary tree adalah struktur data tree dimana setiap node nya maksimal mempunyai 2
child. Child dari binary tree sering disebut dengan left child dan right child (anak kiri
dan anak kanan). Setiap node dapat memiliki left child dan right child, atau bisa juga
hanya salah satunya.
Didalam program, kita mendeklarasikan pointer atau reference pada child yang
kosong dengan nilai NULL. Contoh gambar :
Jadi dapat dikatakan, pada node 1, left child nya bernilai NULL. Sama juga dengan
node 15 dimana right child bernilai NULL.
Untuk nodes yang lainnya yang tidak mempunyai child, disebut leaf nodes. Dimana,
pada leaf nodes dapat dikatakan, right child dan left child nya bernilai NULL.
Contohnya (pada gambar) node 2,6,9,16,25.
Nilai efisiensi waktu dari berbagai operasi pada tree bergantung pada height of tree.
(ketinggian pohon)
Height dari tree akan berkurang jika tree tersebut mendekati pada klasifikasi dari
perfect binary tree atau complete binary tree. Jika height dari tree berkurang maka
akan dapat mempengaruhi kompleksitas waktu pada program.
Balanced binary tree (pohon biner yang seimbang) = perbedaan antara ketinggian
pada left dan right subtree untuk setiap node nya adalah tidak lebih dari nilai K (pada
umumnya 1). Height dari tree yang kosong = -1. Height dari tree dengan 1 node = 0.
Nilai efisiensi dari operasi pencarian akan terminimalisir jika kita menggunakan
sorted array. Tapi pada bagian insertion atau removal, kita harus memastikan bahwa
array sudah ter-urut.
SYARAT BINARY SEARCH TREE, yaitu struktur data nya harus sebuah
Array dan data yang disimpan harus urut(sorted).
Pada struktur logika ini, setiap node mempunyai 3 fields dan 3 sel. Sel sebelah kiri
untuk menyimpan alamat dari left child. Dan sel sebelah kanan untuk menyimpan
alamat dari right child.
Permisalan seperti gambar dibawah ini :
Dapat dikatakan bahwa identitas dari tree adalah alamat dari setiap root node. Maka
dari itu diperlukan pointer yang menunjuk ke node dimana pointer tsb berguna untuk
menyimpan alamat dari root node.
Kita dapat mendeklarasikan pointer dengan NULL untuk menyatakan bahwa tree
kosong.
Jika root masih kosong dan akan dimasukkan sebuah data, maka akan
diproses pada percabangan if yang pertama dimana kondisi root ==
NULL. Setelah dibuat node baru, alamat dari root akan dikembalikan.
Pada bagian percabangan kedua, yaitu else if. Jika data yang dimasukkan
lebih kecil sama dengan root node maka akan dibuat pemanggilan
rekursif untuk memasukkan data ke dalam subtree kiri. Setelah data di
insert di subtree kiri, maka root subtree kiri berubah. Fungsi insert akan
mengembalikan alamat dari root baru yang ada di bagian kiri subtree,
dan root tersebut nantinya akan di-set menjadi left child dari node yang
sudah ada.
Pada bagian else. Jika data lebih besar maka data akan dimasukkan ke
bagian kanan subtree.
Pada int main, fungsi insert akan dipanggil, dan akan digunakan untuk
memasukkan data. (int data) misal pada program, data yang dimasukkan adalah
15,10,20.
Fungsi untuk membuat node baru. = Fungsi GetNewNode . dengan tipe data
integer dan nama variabel = data sebagai argumen.
Fungsi pencarian dengan nama search. Fungsi ini akan menghasilkan nilai true
jika data yang dicari ada, dan false jika tidak ada.
B. MENGECEK APAKAH POHON
BINER BST ATAU BUKAN
Sebuah Binary Tree dapat dikatakan sebagai Binary Search Tree jika mempunyai
struktur rekursif seperti :
1. Subtree kiri adalah node yang memiliki data lebih kecil daripada parent-node
nya.
2. Subtree kanan adalah node yang memiliki data lebih besar daripada parent-
node nya.
3. Subtree kiri dan subtree kanan, keduanya harus menjadi binary search tree.
Membuat fungsi yang akan menghasilkan nilai TRUE jika semua elemen pada
subtree lebih kecil dari value.
Membuat fungsi yang akan menghasilkan niali TRUE jika semua elemen pada
subtree lebih besar dari value.
Fungsi yang akan mengecek apakah sebuah binary tree adalah BST atau bukan
Dalam menentukan sebuah binary tree adalah BST atau bukan, dapat dilakukan
dengan 2 pendekatan.
Sama seperti sebelumnya, namun bagian ini mengecek apakah data pada root
lebih besar dari value atau tidak.
PENDEKATAN 2 : dengan menentukan Maksimum dan Minimum dari subtree.
Menemukan nilai Maksimum pada left subtree dan membandingkannua dengan data
yang ada pada root. Jika nilai maksimum dari subtree lebih kecil, maka semua elemen
akan lebih kecil. Pada right subtree, menggunakan pencarian nilai minimum. Jika nilai
minimum dari subtree lebih besar, maka semua elemennya akan lebih besar.
Pada fungsi ini, akan dicek apakah data pada root berada pada range yang
ditentukan. Pengecekan BST dengan menggunakan fungsi ini lebih simple
daripada menggunakan IsSubtreeLesser or IsSubtreeGreater, karena
kompleksitas waktunya lebih kecil.
Lalu membuat fungsi lain yang hanya mengambil alamat dari root node, dan
fungsi ini dapat memanggi fungsi IsBstUtil.
C. BINARY TREE -- LEVEL ORDER TRAVERSAL --
Pada level order taversal, kita mengunjungi semua node di level (depth) tertentu pada
tree sebelum mengunjungi node yang lainnya di level yang lebih besar.
Traversal adalah proses kunjungan dalam tree dengan setiap node nya hanya
dikunjungi tepat satu kali.
Skema Level-order traversal :
Level akan dimulai dari 0 yaitu root paling atas, dan akan berlanjut setiap level nya
berdasarkan kedalaman (depth) node nya.
Pada gambar, level 0 adalah F, lalu ke level 1 dimulai dari kiri lalu kenan yaitu D dan
J, setelah level 1 selesai ditelusuri semua nodenya akan di lanjutkan ke level 2 yaitu
B, E,G,K dan seterusnya.
F ke D dapat dilakukan karena ada link yang menghubungkan, sedangkan D ke J tidak
bisa karena tidak ada link. D ke F juga tidak bisa karena tidak ada link yang mengarah
dari D ke F. Artinya adalah jika kita sudah berada pada child nodes maka kita tidak
bisa kembali lagi ke parent nodes nya.
FindHeight, yang akan mengambil alamat dari root node sebagai argumen dan akan
mengembalikan nilai tinggi dari binary
Pemanggilan rekursif untuk menenmukan tinggi dari subtree kiri dan subtree
kanan :
Fungsi max adalah fungsi yang akan mengembalikan nilai yang lebih besar
dari 2 nilai yang melewatinya sebagai argumen.
E. MENELUSURI POHON BINER (PreOrder, InOrder, PostOrder)
Binary Tree Traversal adalah proses mengunjungi node tepat satu kali dan tiap node
hanya boleh memiliki maksimal 2 subtree yang disebut sebagai subtree kiri dan
subtree kanan. Mengunjungin Node maksudnya adalah membaca dan memproses data
yang ada pada node tersebut. Mengunjungi Subtree maksudnya adalah mengunjungi
semua node yang ada pada subtree.
InOrder :
1. Mengunjungi left subtree
2. Mengunjungi root
3. Mengunjungi right subtree
Left dan right subtree dikunjungi secara rekursif.