Anda di halaman 1dari 20

STRUKTUR DATA DAN ALGORITMA

Rangkuman Pertemuan 10 dan 11

Nama : Putri Sarah Fransisca


NIM : 1910511037
Jurusan : S1 Informatika
Kelas :B
Dosen : Jayanta, S.Kom., M.Si.

FAKULTAS ILMU KOMPUTER


UNIVERSITAS PEMBANGUNAN NASIONAL “VETERAN” JAKARTA
JAKARTA
2020
STRUKTUR DATA
Struktur data adalah cara untuk menyimpan dan mengorganisir data pada komputer.
Untuk setiap jenis data yang berbeda, kita menggunakan struktur data yang berbeda
pula.
Struktur data terbagi menjadi 2 jenis, yaitu Linear data structures dan Non-linear
data structures.
 Yang termasuk dalam struktur data linear antara lain :
Array Linked List

 Yang termasuk dalam struktur data Non-linear antara lain :


Graph Tree (Pohon)

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

Penjelasan Bagian Tree dan Hubungan Setiap 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.

 Binary tree diklasifikasikan menjadi beberapa macam :


1. Proper binary tree (pohon biner asli) adalah sebuah tree dimana setiap node-
nya memiliki 2 atau 0 child.
2. Perfect binary tree (pohon biner sempurna) adalah sebuah binary tree penuh
dimana semua node memiliki level yang sama.
3. Complete binary tree adalah sebuah tree dimana semua node nya memiliki
level n atau n-1 untuk beberapa n. Agar sebuah tree dapat menjadi complete
binary tree, maka semua child pada level/tingkat terakhir harus menempaati titik
terkiri secara teratur, dengan tidak ada titik yang menganggur diantara keduanya.
Nodes di depth (kedalaman) yang sama = nodes di level yang sama.
Pada gambar diatas, level yang sama ditentukan dengan warna nodes. Warna abu-abu
adalah level 1, merah adalah level 2, biru adalah level 3, hijau adalah level 4 dan
hitam adalah level 5. Pada tree tsb, nilai maksimum depth nya adalah 5.

Jumlah maksimum dari nodes pada level n = 2n.

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.

 Cara Menyimpan Binary Tree pada Memory


Kita dapat mengimplementasikan binary tree menggunakan :
1. Nodes yang dibuat secara dinamis. Nodes dihubungkan dengan nodes yang lain
menggunakan pointers atau references.
2. Arrays.
C. BINARY SEARCH TREE (BST)
Binary search tree adalah salah satu jenis yang istimewa dari binary tree, dimana
binary search tree ini mempunyai struktur yang efisien untuk mengorganisir data
dalam hal pencarian cepat (quick search) sebaik quick update.

Perbandingan Kompleksitas Waktu BST dengan Array dan Linked List :

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).

 BINARY SEARCH TREE(BST), adalah struktur data yang mempunyai aturan


bahwa setiap child node sebelah kiri selalu lebih kecil nilainya daripada root
node. Begitu pula sebaliknya, setiap child node sebelah kanan selalu lebih besar
nilainya daripada root node.
PERTEMUAN 11
BINARY SEARCH TREE (BST)
A. IMPLEMENTASI BST PADA C/C++
Pada kasus tree, hal yang harus slalu diingat adalah alamat dari root node. Jika kita
tau root node nya, kita bisa mengakses semua nodes yang ada pada tree menggunakan
links.
Untuk membuat Tree, pertama-tama kita mendeklarasikan pointer ke BST Node

Pointer ini berguna untuk menyimpan alamat dari root node.

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.

IMPLEMENTASI PADA PROGRAM:


 Kita harus mempunyai variabel yang bertipe pointer ke node untuk menyimpan
alamat root node.

 Kita dapat mendeklarasikan pointer dengan NULL untuk menyatakan bahwa tree
kosong.

 Mendeklarasikan fungsi yang berguna untuk memasukkan node ke dalam tree.


Misal, fungsi dengan nama INSERT yang akan mengambil alamat dari root node
dan data yang akan dimasukkan ke posisi yang sesuai pada tree.

 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.

 Operator New berfungsi untuk mengembalikan alamat dari node yang


baru saja dibuat yang disimpan pada variabel yang bertipe pointer ke
dalam BstNode.

 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.

IMPLEMENTASI PADA PROGRAM C++


 Fungsi yang akan menggunakan pointer atau reference ke root node dari binary
tree dan fungsi akan menghasilkan nilai TRUE jika binary tree adalah binary
search tree, dan FALSE jika bukan 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.

PENDEKATAN 1 : Membuat fungsi bool IsSubtreeLesser dan IsSubtreeGreater


 Mengecek data pada root apakah lebih kecil sama dengan value atau tidak.
Terdapat pengecekan secara rekursif untuk mengetahui apakah root kiri dan
kanan lebih kecil dari value atau tidak. Jika ketiga kondisi pada IF kedua
memenuhi maka TRUE. Jika tidak maka False

 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.

CARA VISIT NODES IN LEVEL ORDER PADA PROGRAM


Dapat kita lakukan dengan hanya menggunakan satu pointer. Saat mengunjungi node
kita dapat menyimpan alamat child nodes nya di dalam Queue, jadi child nodes
tersebut dapat dikunjungi nanti. Node pada Queue dapat dikatakan sebagai ‘Node
yang ditemukan’ dimana alamatnya sudah diketahui tapi belum dikunjungi.
Misalnya, kita mulai dengan satu node yang telah ditemukan alamatnya, jadi selama
Queue nya mempunyai setidaknya satu node yang telah ditemukan (Queue tidak
kosong), kita dapat mengambil node yang paling depan, lalu node tersebut
dikunjungi,, lalu memasukan alamat child node nya kedalam Queue. Dalam
menggunakan Queue kita melakukan 2 hal :
1. Disaat kita berpindah node, kita tidak kehilangan reference dari child node nya,
karena kita telah menyimpan reference tersebut.
2. Karena struktur Queue adalah First In First Out (FIIFO), jadi node yang
pertama kali ditemukan, itulah yang akan dikunjungi pertama kali
Traversal akan selesai disaat Queue telah kosong.

Kode Program pada C++ implementasi Level-order Traversal

 Untuk menggunakan code tersebut, diperlukan penggunaan library queue.


Yaitu #include<queue>
 Queue<Node*> Q , adalah queue dengan pointer yang menunjuk ke node.
 Q.push(root), adalah yang mendeklarasikan satu node yang telah diketahui
 Lalu ada kondisi While(!Q.empty()), pengecekan kondisi dimana disaat
queue mempunyai setidaknya satu node yang telah diketahui. Lalu akan
masuk kedalam loop, dan didalam loop node akan diambil dari depan.
 Q.pop(), adalah untuk menghapus elemen yang ada di depan.
D. MENEMUKAN TINGGI BINARY TREE
Menemukan nilai tinggi (height) sama dengan menemukan nilai kedalaman
maksimum (depth) dari binary tree.
Tinggi dari node adalah ukuran simpul-simpul yang terhubung dimana yang dicari
adalah ukuran terpanjangnya dari node tertentu menuju ke leaf node.

Logika untuk menghitung Height pada program :


Untuk setiap node, jika kita bisa menghitung tinggi subtree bagian kiri dan juga tinggi
subtree bagian kanan, maka tinggi dari node tersebut akan menjadi lebih besar dari
tinggi subtree kiri dan subtree kanan ditambah 1.

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.

Binary Tree Traversal :


 Breadth First = Lever Order
 Depth First = PreOrder, InOrder, PostOrder

Terdapat 3 macam permutasi dalam Binary Tree Traversal :


1. PreOrder : root, left, right
 Maksudnya adalah kunjungan pada pohon biner dimulai dari root node
kemudian ke subtree kiri, setelah subtree kiri dikunjungi baru subtree kanan
dikunjungi
2. InOrder : left, root, right
 Maksudnya adalah penelusuran pada binary tree dimulai dari node turunan
subtree kiri, lalu ke root node, baru kemudian node turunan pada subtree
kanan.
3. PostOrder : left, right, root
 Maksudnya adalah penelusuran pada binary tree dimulai dari node turunan
subtree kiri, baru kemudian node turunan pada subtree kanan, kemudian ke
root node.
F. INORDER SUCCESSOR PADA BST
InOrder Successor adalah node yang akan muncul sesaat setelah node yang telah
diberikan dalam InOrder traversal pada BST. InOrder Successor menjadi NULL
unruk node terakhir pada InOrder traversal.

InOrder :
1. Mengunjungi left subtree
2. Mengunjungi root
3. Mengunjungi right subtree
Left dan right subtree dikunjungi secara rekursif.

Fungsi Untuk Menemukan InOrder Successor pada BST

Kasus 1 : Node mempunyai subtree bagian kanan, maka


 Pergi ke node paling kiri dari subtree kanan atau temukan minimum dari
subtree kanan

Kasus 2 : Tidak mempunyai subtree bagian kanan, maka


 Pergi ke ancestor paling dekat dimana node yang diberikan berada di subtree
bagian kiri.

Anda mungkin juga menyukai