ADT Tabel dengan Struktur Hirarkis

Suatu struktur binary tree dapat digunakan untuk mengimplementasikan ADT tabel. Sebagai suatu tabel struktur ini memberikan kelebihan-kelebihan mengingat strukturnya yang hirarkis memungkinkan proses-proses pencarian yang logaritmis. Sementara dengan struktur linier seperti linear linked-list diperlukan waktu pencarian yang linear. (Tanya: Bagaimana bisa jadi logaritmis?)

Definisi Binary Search Tree

Stuktur Binary Search Tree (BST) didefinisikan sebagai suatu binary tree dimana pada setiap subtree T -nya: key dari node-node subtree kiri dari T < key root T < key dari node-node subtree kanan dari T. sayang, anda harus menggunakan browser yang java 1.1.* enable.....


Contoh:
sayang, anda harus menggunakan browser yang java 1.1.* enable..... Cara paling mudah apakah key-key dalam suatu binary tree membentuk struktur BST adalah dengan melihatnya harga-harga key jika ditraverse secara inorder. Secara inorder maka key-key tersebut terurut menaik dan tidak ada yang sama. Contoh inorder traversal pada BST di atas menghasilkan:
3, 5, 8, 11, 14, 19, 22, 24, 25, 31, 39, 41, 44.

Algoritma Pencarian

Berdasarkan definisinya yang demikian maka pencarian suatu key tertentu dapat dilakukan secara rekursif, yaitu setiap saat akan dilakukan pemeriksaan harga key yang dicari terhadap harga key dari root suatu subtree:


Selengkapnya algoritma pencarian suatu data dengan key K adalah sbb.

BinaryTreeNode BinarySearchSearch (KeyType Key) {
   if (this.equals(Key)) return P;
   else if (this.greaterThan(Key))
      if (left != null)
      return left.BinarySearchSearch(K);
      else return null;
   else
      if (left != null)
      return right.BinarySearchSearch(K);
      else return null;
}

Masalah algoritmis muncul apabila terjadi perubahan struktural:


Karena modifikasi dapat dianggap sebagai penghapusan dan penyisipan yang dilakukan sekaligus maka secara algoritma yang akan dibahas adalah hanya dua masalah: penyisipan dan penghapusan.

Penyisipan Key K

Penyisipan suatu key baru ditangani dengan dengan sederhana, yaitu node Q dicreate untuk key tsb. dan disisipkan sebagai leaf baru pada posisi yang sesuai setelah proses pencarian. Algoritma penyisipan selengkapnya: InsertNode(Q) {
   if (this.equals(Q)) {
      system.out.println("has already been in the table\n");
   } else if (this.greaterThan(Q)) {
      if (left != null) left.Insert(Q);
      else left = Q;
   } else {
      if (left != null) right.Insert(Q);
      else right = Q;
   }
}

Contoh jika pada diagram tree di atas dilakukan penyisipan berturut-turut key-key 33, 50, 10, 17 maka tree akan berubah menjadi sbb.

sayang, anda harus menggunakan browser yang java 1.1.* enable..... sayang, anda harus menggunakan browser yang java 1.1.* enable..... sayang, anda harus menggunakan browser yang java 1.1.* enable..... sayang, anda harus menggunakan browser yang java 1.1.* enable.....

Penghapusan Key K

Proses penghapusan lebih rumit karena bisa terjadi bahwa node (kita sebut node P) dimana K berada merupakan internal node. Masalah ini dipecahkan adalah dalam tiga kasus (secara rekursif):
 

Contoh

Binary Search Tree ini dalam kondisi kedatangan key acak yang membentuk suatu struktur tree yang imbang (balance). Namun, kemunculan data baru atau penghapusan suatu data kurang acak akan menyebabkan struktur tree yang tidak merata (tidak imbang). Paling ekstrim jika menyusun BST dengan data yang sudah terurut, maka struktur yang terbentuk adalah suatu linear list. Dalam kasus demikian, manfaat struktur tree, yang memungkinkan pencarian logaritmis,  jadi tidak tercapai. Jadi BST mensyaratkan kemunculan data pada penyisipan yang cukup acak.

Apabila syarat tersebut tidak bisa terpenuhi dan struktur BST harus berfungsi sebagai indeks dalam proses pencarian yang logaritmis maka ada beberapa hal yang bisa dilakukan. Cara pertama adalah cara yang naif, dilakukan penyusunan ulang (restrukturisasi) secara total, setiap kali dilakukan penyisipan dan penghapusan atau secara periodik setelah sejumlah penyisipan dan penghapusan dilakukan. Namun, hal ini amat mahal untuk data yang banyak kecuali jika penyisipan/penghapusan tersebut tidak terlalu sering terjadi.

Untuk menemukan suatu solusi efisien maka digunakan suatu kelas binary tree yaitu Balanced Binary Tree, yang lebih dikenal dengan nama AVL Tree.

AVL TREE

AVL tree memiliki sifat-sifat khusus yang memungkinkan restrukturisasi terjadi secara lokal dengan aturan-aturan sederhana. Nama AVL berasal dari inisial nama-nama penemunya: G.M. Adelson-Velskii dan E.M. Landis. Mereka pada tahun 1962 adalah yang pertama melakukan studi mengenai sifat-sifat tree ini. Nama Balanced Binary Tree berkaitan dengan sifat strukturnya yang selalu "imbang" atau "hampir imbang".

Definisi

Suatu AVL Tree adalah suatu tree kosong atau suatu binary tree dengan kedua subtree yang juga merupakan AVL Tree dengan perbedaan tinggi tidak lebih dari 1.

Generalisasi definisi "tinggi" suatu tree untuk dapat digunakan untuk AVL Tree:


Secara grafis dapat digambarkan sebagai berikut.

Contoh-contoh AVL tree dengan tinggi h.
h=0 sayang, anda harus menggunakan browser yang java 1.1.* enable.....
h=1 sayang, anda harus menggunakan browser yang java 1.1.* enable..... sayang, anda harus menggunakan browser yang java 1.1.* enable.....
h=2 sayang, anda harus menggunakan browser yang java 1.1.* enable..... sayang, anda harus menggunakan browser yang java 1.1.* enable.....
h=5 sayang, anda harus menggunakan browser yang java 1.1.* enable.....

Fibonacci Tree

Anda mungkin sudah tahu Fibonacci Numbers, yaitu bilangan-bilangan yang digenerate oleh fungsi Fibonacci fib(x): fib(x) = fib(x-1) + fib(x-2) untuk x > 1
fib(1) = 1
fib(0) = 0
Fibonacci Tree adalah suatu AVL tree yang mana beda tinggi antara subtree kiri dan kanan pada setiap internal node SELALU 1. Jumlah node dalam suatu Fibonacci Tree dengan tinggi h adalah g(x) = g(x-1) + g(x-2) + 1 untuk x > 1
g(1) = 2
g(0) = 1

Jadi dengan demikian Fibonacci Tree dengan tinggi h adalah AVL Tree dengan tinggi h dengan jumlah node minimum sementara AVL Tree dengan tinggi h dengan jumlah node maksimum adalah Perfect Binary Tree.

Pertanyaan:

Berapakah tinggi AVL Tree dengan jumlah node n? TInggi minimal adalah tinggi dari Perfect Binary Tree dengan jumlah node n dan tinggi maksimal adalah tinggi dari Fibonacci Tree dengan jumlah node n. Dan tinggi AVL Tree berada di antara kedua ekstrimnya itu. Tinggi Perfect Binary Tree mudah dijawab, tetapi tinggi berapa Fibonacci Tree?

Balance Factor

Untuk memudahkan algoritmanya maka perlu didefinisikan juga pada tiap node dalam AVL tree suatu flag yang berisikan selisih tinggi subtree kanan dikurangi dengan tinggi subtree kiri dari node tersebut. Kita namaan flag tersebut adalah Balance Factor (BF).: BF(node P)= tinggi subtree kanan - tinggi subtree kiri

Jadi suatu binary tree dengan BF dari node-nodenya berharga -1 atau 0 atau +1 adalah suatu AVL tree. Operasi penyisipan atau penghapusan pada AVL-tree hanya akan mempengaruhi BF dari ancestor dari node tempat terjadinya operasi tersebut sehingga pemeriksaan dilakukan sepanjang path ancestor tersebut saja mulai dari bawah ke atas.

Dari contoh h=5 di atas maka BF dari masing-masing node digambarkan sebagai bilangan di samping masing-masing node sbb.
sayang, anda harus menggunakan browser yang java 1.1.* enable.....

Suatu Fibonacci tree adalah suatu AVL Tree dengan node-node internalnya memiliki BF = +1 atau -1. Suatu Perfect Binary Tree adalah suatu AVL Tree dengan node-node internalnya memiliki BF = 0. Contoh AVL dengan h=5 di atas adalah juga merupakan Fibonacci Tree.



Handout berikutnya, atau sebelumnya, atau kembali ke halaman utama