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