Anda di halaman 1dari 35

Tree

Tree

 Kumpulan node yang saling terhubung satu sama lain dalam suatu
kesatuan yang membentuk layaknya struktur sebuah pohon
 Struktur pohon adalah suatu cara mempresentasikan suatu struktur hirarki
(one to many) secara grafis yang mirip sebuah pohon, walaupun pohon
tersebut hanya tampak sebagai kumpulan node node dari atas ke awah
 Satu pohon terdapat satu akar
 Jika suatu node dalam tree memiliki 2 anak, maka disebut binery tree
 Setiap simpul n terhubung dengan simpul p. dimana p parent dari n
Istilah Dalam Tree
Node Serupa dengan simpul, node merupakan
kerangka dasar dari sebuah tree (pohon),
kadang disebut sebagai "key". Sebuah node
dapat mengandung informasi tambahan (atau
payload), meskipun informasi dalam node ini
tidak wajib tetapi sangat penting dalam
implementasi struktur data tree.
Edge Garis penghubung antara dua buah node yang
menunjukkan adanya relasi (hubungan) diantara
kedua node. Setiap node (kecuali node root)
terhubung dengan satu penguhubung yang
menuju ke dalam node dan beberapa
penghubung yang mengarah keluar dari node.
Root Satu-datunya node dalam tree yang tidak
memiliki garis penghubung (edge) yang
mengarah ke dalam root, edge yang
menghubungkan root semua mengarah ke luar
dari node. (cikal-bakal)
Path Jalur yang menghubungkan antara satu node
dengan node yang lain, dapat dterdiri dari
beberapa node dan edge yang
berkesinambungan.
Predecesor Node yang berada diatas node tertentu
Istilah Dalam Tree
Successor Node yang berada dibawah node tertentu

Ancestor Seluruh node yang terletak sebelum node


tertentu dan terletak pada jalur yang sama
Descendant Seluruh node yang terletak setelah node tertentu
dan terletak pada jalur yang sama
Parent Predecessor satu level di atas suatu node

Child Successor satu level dibawah suatu node

Subtree Sekelompok node beserta turunnanya (anak-


anaknya).
Height Banyaknya tingkatan dalam suatu tree

Root Node khusus yang tidak memiliki predecessor

Leaf Node node dalam tree yang tidak memiliki


successor
Path Jalur yang menghubungkan antara satu node
dengan node yang lain, dapat dterdiri dari
beberapa node dan edge yang
berkesinambungan.
Istilah Dalam Tree
Implementasi

 BinaryTree () membuat contoh baru dalam binary tree


 get_left_child() mengembalikan binary tree yang sesuai dengan anak kiri
dari node
 get_right_child() mengembalikan binary tree yang sesuai dengan anak
kanan dari node
 set_root_val(val) menyimpan objek dalam parameter val di node
 get_root_val () mengembalikan objek yang disimpan di node
 insert_left (val) membuat pohon biner baru dan menginstalnya sebagai
anak kiri dari node
 insert_right (val) membuat pohon biner baru dan memasangnya sebagai
anak kanan dari node
Implementasi
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, maka tiap node dalam binary tree hanya
boleh memiliki paling banyak dua child.
Heap

 Heap adalah biner struktur data tree berbasis lengkap yang memenuhi
properti heap.
Jenis-Jenis Dari Properti Heap

Jenis dari properti heap yaitu :


 Max-Heap adalah Setiap element nodenya lebih besar dari anaknya.

 Min-Heap adalah Setiap element nodenya lebih kecil dari anaknya.


Operasi – Operasi Heap

 Insert
Untuk menambahkan elemen ke dalam tree. kita harus melakukan operasi
up-heap, dengan mengikuti algoritma ini:
1. Tambahkan elemen ke tingkat bawah tree.
2. Bandingkan elemen ditambah dengan induknya; jika mereka berada di
urutan yang benar, berhenti.
3. Jika tidak, menukar elemen dengan induknya dan kembali ke langkah
sebelumnya.
 Contoh Insert:

katakanlah kita memiliki max-heap diatas dan kita ingin menambahkan


nomor 15 ke tree. Kita menempatkan pertama 15 dalam posisi ditandai
dengan X. Namun, properti heap dilanggar karena 15 lebih besar dari 8, jadi
kita perlu menukar 15 dan 8. Jadi, kita harus mencari tumpukan sebagai
berikut setelah yang pertama swap:

Namun properti heap masih dilanggar sejak 15 lebih besar dari 11, jadi kita
perlu swap lagi:

yang merupakan max-heap yang valid. Tidak perlu untuk memeriksa anak-
anak setelah ini. Sebelum kami menempatkan 15 pada X, tumpukan itu
berlaku, yang berarti 11 lebih besar dari 5. Jika 15 lebih besar dari 11, dan 11
lebih besar dari 5, maka 15 harus lebih besar dari 5, karena hubungan transitif.
Operasi – Operasi Heap

 Delete
Prosedur untuk menghapus akar dari tree dan mengembalikan sifat disebut
down- heap, dengan mengikuti algoritma ini:
1. Ganti akar tree dengan elemen terakhir pada tingkat terakhir.
2. Bandingkan akar baru dengan anak-anaknya, jika mereka berada di
urutan yang benar, berhenti.
3. Jika tidak, menukar elemen dengan satu anak dan kembali ke langkah
sebelumnya .(Swap dengan anak yang lebih kecil dalam min - heap dan
anak yang lebih besar dalam max - heap)
 Contoh delete:

Pertama kita hapus 11 dan menggantinya dengan 4

Namun Sekarang properti heap dilanggar karena 8 lebih besar dari 4. Dalam
hal ini, menukar dua elemen, 4 dan 8 , sudah cukup untuk mengembalikan
properti tree dan kita tidak perlu menukar elemen lanjut :

Ke bawah yang bergerak simpul swap dengan lebih besar dari anak-anaknya
dalam max - heap (dalam min - heap akan bertukar dengan anak yang lebih
kecil), sampai memenuhi tree properti dalam posisi baru.
Deap

 Deap adalah tipe data abstrak mirip dengan antrian prioritas. hal itu
memungkinkan untuk penghapusan efisien dari kedua maksimum dan
minimum elemen. Ini adalah struktur data di mana orang bisa
memasukkan unsur-unsur dan kemudian menghapus elemen dengan
minimum atau maksimum prioritas.
Penelusuran Binary Tree (Traversing Binary
Tree)
Ada tiga cara yang standar untuk menelususi sebuah binary tree yaitu :
1. Preorder (Node – Left – Right [NLR])
 Proses root
 Telusuri subtree kiri (Left) secara preorder
 Telusuri subtree kanan (Right) secara preorder
2. Inorder (Left – Node – Right [LNR])
 Telusuri subtree kiri (Left) secara inorder
 Proses root
 Telusuri subtree kanan (Right) secara inorder
3. Postorder (Left – Right – Node [LNR])T
 Telusuri subtree kiri (Left) secara postorder
 Telusuri subtree kanan (Right) secara postorder
 Proses root
 Contoh:

Secara preorder : ABDGCEHIF


Secara inorder : DGBAHEICF
Secara postorder : GDBHIEFCA
Pembentukan Binary Tree berdasarkan
Preorder, Inorder atau Postorder
 Untuk membentuk suatu binary tree berdasarkan preorder, inorder atau postorder dapat dilakukan
dengan syarat menggunakan 2 dari tiga penelusuran tersebut dan salah satunya harus inorder.
 Contoh 1 :
Secara preorder : ABDGCEHIF
Secara inorder : DGBAHEICF
Caranya adalah :
1. Telusuri sepanjang preorder
2. Didapat A, kemudian jadikan sebagai Root
3. Ambil B, lihat di inorder. B berada sebelah kiri dari A,maka B ditulis di kiri dari A.
4. Ambil D, lihat di inorder. D berada di sebelah kiri dariA, tetapi sebelah kiri dari A ada B. Bandingkan
posisi Ddengan B yang ada di inorder. Ternyata D ada di sebelahkiri dari B sehingga D menjadi
subtree B.
5. Ambil G, ikuti cara 4. ternyata G ada disebelah kanandari D sehingga G menjadi subtree kanan
dari G.
6. Ambil C, lihat di inorder, ternyata C ada disebelahkanan dari A, sehingga C menjadi subtree kanan
dari A.
7. Ambil E, ternyata sebelah kanan dari A serta sebelahkiri dari C sehingga E menjadi kiri dari C.
8. Ambil H, ternyata ada di sebelah kanan A serta sebelahkanan dari C dan sebelah kiri dari E
sehingga H menjadikiri dari E.
9. Ambil I, ternyata ada di sebelah kanan dari A sertasebelah kiri dari C, dan sebelah kanan E
sehingga Imenjadi subtree kanan dari E.
10. Ambil F ternyata ada di sebelah kanan C serta sebelahkanan dari C sehingga C menjadi subtree
kanan dari C.
 Contoh 2 [Menggunakan Postorder dan Inorder]:
Secara postorder : GDBHIEFCA
Secara inorder : DGBAHEICF
Cara mirip dengan contoh 1, tetapi penelusuran dilakukan pada postorser
secara terbalik (dari paling belakang).
Caranya adalah :
1. Ambil dari postorder dapat A, jadikan sebagai root.
2. Ambil C, periksa posisi C di inorder terhadap A,ternyata ada di sebelah kanan.
Sehingga C subtree kanandari A.
3. Ambil F, ternyata ada di sebelah kiri dari A dan sebelahkanan dari C sehingga F
menjadi subtree kanan dari C.
4. Ambil E, ternyata ada di sebelah kanan dari A dansebelah kiri dari C sehingga
E menjadi subtree kiri C.
5. Ambil I, ternyata ada di sebelah kanan dari A, sebelahkiri dari C, sebelah kanan dari
E sehingga I menjadisubtree kanan dari C.
6. Ambil H, ternyata ada di kanan A, sebelah kiri dari C,sebelah kiri dari E sehingga H
menjadi subtree kiri dari E.
7. Ambil B, ternyata B ada disebelah kiri A sehingga Badalah subtree kiri dari A.
8. Ambil D, ternyata ada di kiri A dan dikiri B, sehingga Dmenjadi subtree kiri dari B.
9. Ambil G, ternyata ada di kiri A, di kiri B dan dikanandari D sehingga G menjadi
subtree kanan dari D.
Binary Search Tree

 Telah kita lihat bahwa ada dua cara untuk mendapatkan pasangan key-
value dalam sebuah koleksi. Ingat bahwa koleksi ini melaksanakan
pemetaan data abstrak. Dua peralatan dari tipe data abstrak yang telah
dibahas adalah binary search dengan menggunakan tabel list dan hash.
Pada bagian ini akan dibahas mengenai pohon pencarian biner yang
mana merupakan salah satu cara untuk memetakan dari key ke value.
Operasi Binary Search

Sebelum masuk ke bagian implementasi, mari lihat kembali tampilan antarmuka


yang telah disediakan oleh peta tipe data abstrak. Tampilan antar muka ini sangat
mirip dengan bahasa pemrograman Python.
 Map () : membuat peta baru atau peta kosong.
 put (key,val) : menambahkan pasangan key-value ke peta. Jika key sudah
ada di dalam peta, maka value yang lama akan diganti dengan value yang
baru.
 get (key) : diberikan key, kembali ke value yang tersimpan di peta atau None
atau sebaliknya.
 del : Menghapus pasangan key-value dari peta menggunakan statement dari
bentuk del map [key].
 len () : Kembali ke angka pasangan key-value yang tersimpan pada peta
 in Return True : untuk statement dalam bentuk key in map, jika diberikan key di
dalam peta.
Menjalankan Search Tree
 Binary Search Tree mengandalkan sifat bahwa key yang kurang
dari parent ditemukan di subtree kiri dan key yang lebih dari parent
ditemukan di subtree kanan. Sifat ini kita sebut sifat binary search
tree (bst property). Sebagai mana kita menjalankan peta yang
telah dijelaskan di atas, sifat binary search tree akan memandu
pelaksanaan yang dibuat.
 Sekarang perhatikan bagaimana sebuah binary search tree
dibentuk. Search tree dalam gambar mewakili node yang ada
setelah memasukkan data yang ditampilkan secara urut , yaitu: 70,
31, 93, 94, 14, 23, 73. Karena 70 merupakan key pertama yang
dimasukkan ke tree, maka 70 disebut root. Selanjutnya, 31 kurang
dari 70, maka 31 merupakan child kiri dari 70. Selanjutnya, 93 lebih
dari 70, maka 93 merupakan child kanan dari 70. Sekarang kita
punya dua level dari tree yang telah terisi, jadi key selanjutnya akan
menjadi child kiri atau child kanan dari 31 atau 93. Karena 94 lebih
dari 93, maka 94 menjadi child kanan dari 93. Dengan cara yang
serupa, karena 14 kurang dari 31, maka 14 merupakan child kiri dari
31. Karena 23 kurang dari 31, maka 23 menjadi subtree kiri dari 31,
dan karena 23 lebih dari 14, maka 23 merupakan child kiri dari 14.
 Untuk menjalankan Binary Search Tree, akan digunakan node dan
rujukan yang mendekati ke salah satu yang kita jalankan seperti
linked list, dan ekspresi tree. Karena kita harus membuat dan
bekerja dengan pencarian biner yang kosong, kita akan
menggunakan dua kelas untuk menjalankannya. Kelas pertama
disebut BinarySearchTree dan kelas kedua disebut TreeNode.
BinarySearchTree mengacu ke kelas TreeNode yang merupakan
root dari pohon pencarian biner. Berikut adalah program untuk
membuat kelas BinarySearchTree
 # Basic BinarySearchTree class – incomplete  Kelas TreeNode menyediakan fungsi pembantu
yang membuat pekerjaan selesai lebih mudah di
dalam metode kelas BinarySearchTree. Berikut
adalah kelas TreeNode
 # Completed TreeNode class
Metode Put

 Selain menggunakan cara yang kita lakukan di atas, kita dapat juga
menggunakan metode put untuk membuat binary search tree. Metode put
digunakan untuk membuat kelas BinarySearchTree. Metode ini akan memeriksa
apakah tree sudah memiliki root. Jika tidak ada root, maka put akan membuat
TreeNode yang akan menginstalnya menjadi root. Adapun fungsi root memiliki
algoritma sebagai berikut:
 Dimulai dari root dari tree, binary search tree akan membandingkan key yang
baru ke key yang ada di dalam node yang baru. Jika key yang baru kurang
dari node, maka key akan menjadi subtree kiri. Sebaliknya, jika key lebih dari
node yang baru, maka key akan menjadi subtree kanan.
 Ketika tidak ada child kiri (atau kanan), dapat kita temukan posisi di dalam tree
di mana node baru harus dipasang.
 Untuk menambahkan node ke tree, buatlah objek TreeNode yang baru dan
sisipkan objek pada titik yang ditemukan pada langkah sebelumnya.
 Berikut adalah program dari membuat binary search tree menggunakan
metode put:
Metode Get

 Metode get merupakan metode untuk membentuk pohon pencarian biner


yang lebih mudah dari metode put karena metode get menyederhanakan
pohon pencarian biner secara rekursif sampai pohon pencarian biner
mendapatkan non-matching node atau menemukan matching key. Jika
matching key ditemukan, value akan tersimpan ke dalam muatan berisi
node.
 Di bawah ini akan ditunjukkan kode untuk get, _get, dan _getitem_. Kode
pencari _get memiliki logika yang sama dengan metode _put untuk
memilih yang mana yang akan dijadikan sebagai child kiri atau kanan.
Perhatikan bahwa metode _get kembali ke TreeNode untuk memperoleh
data, ini membuat _get digunakan sebagai metode pembantu yang
fleksibel untuk metode BinarySearchTree yang dapat digunakan untuk
memanfaatkan data lain dari TreeNode disamping muatan yang berisi
node tadi. Kode untuk metode get akan ditampilkan sebagai berikut:
 Kode untuk metode get akan ditampilkan sebagai berikut:

 Dengan menggunakan get dapat kita jalankan operasi in dengan menulis


metode _contains_ untuk BinarySearchTree. Metode _contains_ akan
menyederhanakan untuk memanggil metode get dan memberi nilai True jika
mengembalikan value, dan False, jika mengembalikan None.
 Ingat bahwa _contains_ memberi kekuatan pada operator in dan kita dapat
menulis statement sebagai berikut:
Menghapus Key
 Langkah pertama adalah mencari node mana yang akan dihapus dengan melakukan
pencarian pada tree. Jika tree memiliki node sebanyak lebih dari satu kita cari
menggunakan cara _get untuk menemukan TreeNode yang akan dihapus. Jika tree
hanya memiliki satu node, maka kita menghapus root dari tree, tapi kita harus memeriksa
untuk memastikan apakah root cocok dengan key yang ingin dihapus. Di kasus ini jika key
tidak ditemukan maka operator del akan menimbulkan error.

 Apabila sudah menemukan node yang berisi key yang ingin dihapus, maka ada tiga
kasus yang harus diperhatikan, yaitu:
 Node yang ingin dihapus tidak memiliki children.
 Node yang ingin dihapus memiliki satu children.
 Node yang ingin dihapus memiliki dua children.
 Kasus pertama sangat mudah. Jika node tidak memiliki anak, maka yang
hanya perlu dilakukan adalah menghapus node dan menghapus rujukan pada
node ini yang termuat pada parent. Berikut adalah kode yang dimaksud:

 Kasus kedua agak sulit. Jika node hanya memiliki children tunggal, maka dapat
dengan mudah mengangkat child tersebut ke posisi parent yang dihapus.
Kode untuk menjalankan perintah pada kasus ini akan ditulis di bawah.
Sebagaimana yang Anda lihat pada kode ini, ada enam kasus yang harus
diperhatikan. Karena kasus ini simetrik dengan apakah memiliki child kiri atau
child kanan. Kita putuskan pada kasus ini di mana node memiliki satu child kiri.
Keputusan dimulai sebagai berikut:
 Jika node yang dimaksud adalah node child kiri, maka kita butuh memperbarui
rujukan parent dari child kiri untuk menunjukkan parent dari node yang dimaksud,
kemudian perbarui rujukan child kiri dari parent untuk menunjukkan node yang
dimaksud adalah child kiri.
 Jika node yang dimaksud adalah node child kanan, maka kita butuh memperbarui
rujukan parent dari child kanan untuk menunjukkan parent dari node yang dimaksud,
kemudian perbarui rujukan child kanan dari parent untuk menunjukkan node yang
dimaksud adalah child kanan.
 Jika node tidak memiliki parent, maka itu pasti root. Pada kasus ini kita hanya
mengganti data pada key, payload, left_child, dan right_child dengan memanggil
fungsi replace_node_data pada root.
 Kasus ketiga merupakan hal yang sangat sulit untuk diatasi. Jika node
memiliki dua children, maka tidak mungkin dapat menaikkan salah
satunya untuk menggantikan posisi node parent. Tapi kita dapat mencari
tree untuk node yang dapat digunakan untuk menggantikan yang
semestinya dihapus. Kita butuh sebuah node yang bisa mengawetkan
hubungan binary search tree untuk subtree kiri dan kanan yang artinya
node ini memiliki key terbesar (dilihat dari sisi child yang sama). Node ini
disebut successor. Successor tidak boleh memiliki lebih dari satu child agar
kita dapat menghapus node menggunakan dua kasus yang telah
diimplementasikan sebelumnya. Ketika successor telah dihapus, dapat
dengan mudah kita tempatkannya ke dalam tree di tempat node yang
telah dihapus.
 Perhatikan bahwa kita gunakan cara helper find_successor dan find_min
untuk mencari successor. Untuk menghapus successor kita gunakan cara
splice_out agar dapat menghapus secara langsung ke node yang ingin
kita hapus dan membuat perubahan yang tepat. Kita dapat
menggunakan delete secara berulang, tapi akan membuang waktu untuk
melakukan pencarian ulang terhadap key node.
Ada tiga kasus yang diperhatikan ketika mencari successor:
 Jika node memiliki child kanan, maka successor adalah key yang terkecil di
subtree kanan.
 Jika node tidak memiliki child kanan, dan child kiri dari parent-nya, maka
parent adalah successor-nya.
 Jika node adalah child kanan dari parent-nya, dan dirinya tidak memiliki
child kanan, maka successor node ini adalah successor dari parent-nya,
tidak termasuk node ini.
 Syarat pertama adalah satu satunya yang penting ketika menghapus
sebuah node dari binary search tree
Metode find_min (menemukan nilai
terkecil)

 Metode ini biasanya digunakan untuk mencari node paling kecil pada
cabang pohon. Node yang mempunyai nilai paling kecil di setiap binary
search tree adalah anak dalam algoritma pohon yang terletak paling kiri
pada tree (algoritma pohon). Karena itu, metode find_min ini cukup
mengikuti informasi tambahan yang terletak di anak sebelah kiri pada
setiap node di suatu cabang pohon algoritma sampai node tersebut tidak
mempunyai informasi tambahan yang terletak di kiri kiri. Secara garis besar,
metode ini bertujuan untuk menghilangkan anak yang paling kiri dalam
suatu node pada subtree.
 Contoh program python untuk fungsi ini :
Fungsi yield-yield
 Python menyediakan fungsi yang cukup handal ketika kita membuat suatu
iterasi (rekursif), fungsi ini yang dinamakan fungsi yield. yield . Fungsi ini
dinamakan juga fungsi pembangkit. Fungsi ini digunakan untuk memanggil
data pada variabel yang telah didefinisikan. Statement yield biasanya
menghentikan fungsi dan menyimpan state lokal agar bisa dilanjutkan
tepat seperti saat dihentikan. Fungsi generator bisa memiliki satu atau lebih
statement yield. Dengan fungsi yield. yield ini kita cukup memanggil
fungsinya sekali tanpa harus memanggil fungsi yang sebelumnya.
 Perbedaan return dan yield adalah, return akan menghentikan (terminasi)
fungsi secara keseluruhan, sementara yield hanya akan menghentikan
sementara (pause) fungsi dan menyimpan semua state variabel yang di
dalamnya untuk nantinya bisa dilanjutkan kembali dari state tersebut.

Anda mungkin juga menyukai