Makalah Struktur data

advertisement
TREE
BINARY TREE TRAVERSAL, BALANCING BINARY
SEARCH TREE, BOUND BALANDCE TREE
DISUSUN OLEH
: KELOMPOK 4
1.
2.
3.
4.
5.
6.
DOSEN PEMBIMBING
Septi Rizky A R
Seri Gustina
Silvia Dewi Sabrina
Sulaiman
Tatu Buhaya
Vidia Rahmadhani
(13540141)
(13540142)
()
(13540150)
(13540153)
(13540156)
:
JURUSAN SISTEM INFORMASI
FAKULTAS DAKWAH DAN KOMUNIKASI
UIN RADEN FATAH PALEMBANG
TAHUN 2014
KATA PENGANTAR
Puji Syukur kami panjatkan kehadirat Allah SWT karena berkat limpahan rahmat
dariNya kami selaku Kelompok 4 dapat menyelesaikan makalah ini tepat pada waktunya,
walaupun dalam keadaan yang sangat sederhana. Makalah ini berisikan tidak lanjut dari
materi pembelajaran kita Pada Tree dan Tree Biner. Dengan segala keterbatasan yang kami
miliki kami sajikan makalah ini dalam bentuk yang sangat sederhana maka dari itu kami
selaku panyaji meminta maaf yang sebesar-besarnya jika makalah ini masih begitu banyak
kekurangan, baik itu yang kami sengaja ataupun tidak sengaja karena ini semua masih
dalam proses pembelajaran kami yang tentunya tak lepas dari kodrad kami sebagai manusia
biasa yang tak akan pernah luput dari kesalahan dan tentunya makalah ini masih sangat jauh
dari sempurna. Semoga makalah ini dapat bermanfaat untuk memberikan wawasan kepada
kalian semua bagi para pembaca. Untuk itu kepada dosen kami untuk meminta masukan,
kritikan atau saran yang membangun untuk melengkapi kekurangan yang ada di makalah ini.
Atas perhatiannya kami selaku Kelompok 4 mengucapkan terima kasih.
Palembang , Desember 2014
BAB I
PENDAHULUAN
1.1. Latar belakang
Pohon(tree) adalah salah satu jenis graf yang tidak memiliki lintasan atau sirkuit.
Pohon biasanya memiliki hanya satu simpul orangtua dan simpul anak yang bisa nol atau
lebih dari nol. Pada pohon juga terdapat yang disebut pohon berakar yaitu pohon yang
satu buah simpulnya dijadikan sebuah akar lalu anak dari akar tersebut akan memiliki
simpul anak dan simpul anak tersebut akan terus memiliki anak sehingga akan ada simpul
yang tidak memiliki anak yang disebut simpul daun.
A
B
D
D
E
Gambar 1-1. Gambar Pohon Berakar
Dalam gambar pohon berakar di atas(Gambar 1-1). Dapat dilihat beberapa terminologi:
A adalah akar dari pohon tersebut
B dan C adalah anak dari A
B adalah orangtua dari D dan E
C,D dan E adalah daun dari pohon
A,B,C,D,E adalah simpul dari pohon
D dan E adalah cucu dari A
Tinggi pohon tersebut adalah 2(akar tidak dihitung)
Dan berlaku hubungan lainya seperti pohon keluarga
Dalam pohon terdapat berbagai jenis pohon, antara lain adalah pohon biner, dan pohon
pencarian biner.
1.2.Tujuan
a. Memahami tentang Tree
b. Mengetahui istilah-istilah dalam Tree
c. Memahami pengertian dari Binary Tree
d. Mengetahui jenis-jenis Binary Tree
e. Memahami transversal
f. Memahami tentang Balancing binary search tree serta contohnya
g. Memahami tentang Bound Balance serta contohnya
BAB II
PEMBAHASAN
2.1. Pengertian Tree
Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree bias
didefinisikan sebagai kumpulan simpul/node dengan elemen khusus yang disebut Root.
Notde lainnya terbagi menjadi himpunan-himpunan yang saling tak berhubungan satu sama
lain (disebut Subtree).
Deklarasi Pohon
Jika kita memperhatikan setiap simpul dalam pohon biner, kita bisa menyusun
struktur data yang tepat dari simpul-simpul tersebut. Kita dapat melihat bahwa dalam
setiap simpul selalu berisi dua buah pointer untuk menunjuk ke cabang kiri dan cabang
kanan, dan informasi yang akan disimpan dalamsimpul tersebut. Dengan memperhatikan
hal ini, simpul dalam pohon biner disajikan sebagai berikut:
KIRI
INFO
KANAN
Gambar 7.1
Sesuai dengan gambar 7.1, maka deklarasi list yang sesuai adalah:
typedef char TypeInfo;
typedef struct Simpul *Tree;
struct Simpul {
TypeInfo Info;
tree Kiri, /* cabang kiri */
Kanan; /* cabang kanan */
};
Untuk lebih jelasnya, di bawah akan diuraikan istilah-istilah umum dalam tree.
a. Predecessor : Node yang berada di atas node tertentu
b. Successor
: Node yang berada dibawah node tertentu
c. Ancestor : Seluruh node yang terletak sebelum node tertentu dan terletak pada jalur
yang sama
d. Descendant Seluruh node yang terletak sebelum node tertentu dan terletak pada jalur
yang sama
e. Parent Predecessor satu level di atas suatu node
f. Child Successor satu level di bawah suatu node
g. Sibling Node-node yang memiliki parent yang sama dengan suatu node
h. Subtree Bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki
semua karakteristik dari tree tersebut.
i. Size Banyaknya node dalam suatu tree
j. Height Banyaknya tingkatan / level dalam suatu tree
k. Root Satu-satunya node khusus dalam tree yang tak punya predecessor
l. Leaf Node-node dalam tree yang tak memiliki successor
m. Degree Banyaknya child yang dimiliki suatu node
2.2. Jenis-Jenis Tree
1. 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 tiap node dalam binary tree hanya boleh memiliki paling banyak dua child.
Jenis- Jenis Binary Tree :
a. Full Binary Tree
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap
subtree harus mempunyai panjang path yang sama.
b. Complete Binary Tree
Jenis ini mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki
panjang path yang berbeda dan setiap node kecuali leaf hanya boleh memiliki 2 child.
c. Skewed Binary Tree
Skewed Binary Tree adalah Binary Tree yang semua nodenya (kecuali leaf)
hanya memiliki satu child.
1.1.Implementasi Binary Tree
Binary tree dapat diimplementasikan dalam C++ dengan menggunakan double
linkedlist.
1.2.Operasi-Operasi pada Binary Tree
Create
: Membentuk binary tree baru yang masih kosong
Clear
: Mengosongkan binary tree yang sudah ada
Empty
: Function untuk memeriksa apakah binary tree masih kosong
Insert
: Memasukkan sebuah node ke dalam tree. Ada tiga pilihan insert :
sebagai root, left child, atau right child. Khusus insert sebagai root, tree
harus dalam keadaan kosong
Find
: Mencari root, parent, left child, atau right child dari suatu node. (tree
tidak boleh kosong).
Update
: Mengubah isi dari node yang ditunjuk oleh pointer curret (Tree tidak
boleh kosong)
Retrieve
: Mengetahui isi dari node yang ditunjuk oleh pointer current (Tree
tidak boleh kosong)
Delete Sub
: Menghapus sebuah subtree (node beserta seluruh descendantnya)
yang ditunjuk current. Tree tidak boleh kosong. Setelah itu, pointer
current dakan berpindah ke parent dari node yang dihapus.
Characteristic : Mengetahui karakteristik dari suatu tree, yakni: size, height, serta
average length. Tree tidak boleh kosong.
Traverse
: Mengunjungi seluruh node-node pada tree, masing-masing sekali.
Hasilnya adalah urutan informasi secara linear yang tersimpan dalam
tree. Ada tiga cara traverse,yaitu PreOrder, InOrder, dan PostOrder.
Langkah-langkah Tranverse :

PreOrder : cetak isi node yang dikunjungi, kunjungi Left Child, kunjungi Right Child

InOrder : kunjungi Left Child, cetak isi node yang dikunjungi, kunjungi Right Child

PostOrder : kunjungi Left Child, kunjungi Right Child cetak isi node yang dikunjungi.
2. Binary Search Tree
Binary Tree ini memiliki sifat dimana semua left child harus lebih kecil dari
pada right child dan parentnya. Semua right child juga harus lebih besar dari left child
serta parentnya.
Binary search tree dibuat untuk mengatasi kelemahan pada binary tree biasa,
yaitu kesulitan dalam searching / pendarian node tertentu dalam binary tree. Pada
dasarnya operasi dalam Binary Search Tree sama dengan Binary Tree biasa, kecuali
pada operasi insert, update, dan delete.
Insert
Pada Binary Search Tree insert dilakukan setelah lokasi yang tepat ditemukan
(lokasi tidak ditentukan oleh user sendiri ).
Update
Update ini seperti yang ada pada Binary Tree biasa, namun di sini update akan
berpengaruh pada posisi node tersebut selanjutnya. Bila update mengakibatkan tree
tersebut bukan Binary Search Tree lagi, harus dilakukan perubahan pada tree dengan
melakukan rotasi supaya tetap menjadi Binary Search Tree.
Delete
Seperti halnya update, delete dalam Binary Search Tree juga turut mempengaruhi
struktur dari tree tersebut.
AVL Tree
AVL Tree adalah Binary Search Tree yang memiliki perbedaan tinggi/ level
maksimal 1 antara subtree kiri dan subtree kanan. AVL Tree muncul untuk
menyeimbangkan Binary Search Tree. Dengan AVL Tree, waktu pencarian dan bentuk
tree dapat dipersingkat dan disederhanakan. Selain AVL Tree, terdapat pula Height
Balanced n Tree, yakni Binary Search Tree yang memiliki perbedaan level antara
subtree kiri dan subtree kanan maksimal adalah n sehingga dengan kata lain AVL Tree
adalah Height Balanced 1 Tree. Untuk memudahkan dalam menyeimbangkan tree,
digunakan simbol-simbol Bantu :
-- (tanda minus) : digunakan apabila Subtree kiri lebih panjang dari Subtree kanan.
+ (tanda plus) : digunakan apabila Subtree kanan lebih panjang dari Subtree kiri.
0 (nol)
: digunakan apabila Subtree kiri dan Subtree kanan mempunyai height
yang sama.
Daftar Istilah-Istilah

Algoritma : Langkah-langkah menyelesaikan suatu masalah yang disusun
secara logis dan berurutan

Animasi : Gambar yang tampak bergerak, terdiri dari banyak gambar-gambar
tunggal (disebut frame) yang ditampilkan satu per satu secara bergantian dengan
cepat sehingga objek dalam gambar tampak seolah-olah bergerak.

Array : Struktur data yang memiliki banyak elemen di dalamnya, dengan
masing-masing elemen memiliki tipe data yang sama.

Clear : Menghapus secara keseluruhan, biasanya digunakan sebagai nama
fungsi/metode yang bertujuan untuk mengosongkan list atau menghapus
keseluruhan elemen.

Console : Istilah dalam komputer yang menunjuk pada antarmuka antara
pemakai dengan komputer yang berbasiskan teks. Cara kerja konsol sangat
sederhana yaitu menggunakan standar input untuk membaca input dari keyboard
dan standar output untuk menampilkan teks ke layer monitor.

Data : Informasi yang disimpan komputer, dapat berbentuk teks, gambar, suara,
video, dan sebagainya.

Delete : Menghapus sebuah elemen, biasanya digunakan sebagai nama
fungsi/metode yang bertujuan untuk menghapus sebuah elemen dalam suatu
list/tree

Deret geometric : Deretan bilangan yang setiap bilangan merupakan hasil kali
bilangan sebelumnya dengan suatu konstanta.

Destruktor : Metode khusus dalam sebuah kelas untuk menghapus objek hasil
instansiasi kelas tersebut

Dimensi : Jumlah indek yang diperlukan untuk menyatakan sebuah elemen
dalam array

Elemen : Sebuah data tunggal yang paling kecil dari sebuah array atau list. Data
tunggal disini tidak perlu data sederhana, melainkan bisa berupa kumpulan data
atau list yang lain.

Empty : Keadaan di mana list ada dalam keadaan kosong

Fibonacci : Barisan bilangan yang setiap bilangan merupakan jumlah dari dua
bilangan sebelumnya.

Field : Data yang dimiliki oleh sebuah objek

FIFO : First In First Out sifat suatu kumpulan data. jika sebuah elemen A
dimasukkan lebih dulu dari B maka A harus dikeluarkan dulu dari B

FPB : Faktor Persekutuan terbesar, faktor yang paling besar jika sejumlah
bilangan memiliki beberapa faktor yang sama.

Full : Keadaan di mana list penuh, tidak boleh menerima data lagi

Fungsi : Suatu modul atau bagian program yang mengerjakan suatu program
tertentu.

Himpunan : Kumpulan dari objek-objek, misalnya sebuah himpunan dari buahbuahan dapat terdiri dari pisang, mangga, jambu dll.

Indeks : Bilangan yang digunakan untuk menyatakan posisi suatu elemen dalam
array atau list.

Input : Data masukkan, dalam fungsi berarti parameter yang dimasukkan,
sedangkan dalam program secara keseluruhan berarti data yang dimasukkan
pemakai, bias melalui parameter program, file maupun lewat keyboard

Insert : Memasukkan sebuah elemen baru ke dalam list. Biasanya insert
dilakukan baik di tengah-tengah list, awal, maupun di akhir list.

Iterasi : Perulangan dengan struktur perulangan, while, do while, maupun for.

Kelas : Suatu struktur yang digunakan sebagai template bagi objek-objek yang
sama sifatnya.

Kompilasi : Proses menerjemahkan bahasa sumber (source code) ke dalam
bahasa lain, biasanya bahasa mesin, untuk dapat dijalankan langsung oleh
computer melalui system operasi.

Kompiler : Program yang mengerjakan kompilasi.

Konstruktor : Metode khusus yang dimiliki suatu kelas untuk membentuk
suatu objek baru berdasarkan kelas tersebut

Library : Kumpulan fungsi, makro, template, dan kelas yang disediakan
bersama compiler C++.

LIFO : Last In Fisrt Out, sifat kumpulan data, kebalikan dari FIFO

Linked List : List yang didesain dengan cara mendefinisikan sebuah elemen
yang memiliki hubungan atau link dengan elemen lain yang dihubungkan
dengan elemen yang lain lagi.

Matriks : Dalam matematika berarti kumpulan bilangan yang disusun dalam
bentuk kolom dan baris.

Metode : Fungsi yang dimiliki suatu objek

Objek : Struktur data yang terdiri dari data yang lebih sederhana yang disebut
field yang memiliki operasi sendiri untuk menangani data-data yang
dimilikinya.

Output : Data yang dihasilkan oleh program

Pointer : Type data khusus yang pada umumnya berukuran 32 bit yang
berfungsi untuk menampung bilangan tertentu yang menunjuk pada lokasi
memory tertentu

Pop : Mengeluarkan satu elemen dari dalam list dengan cara menyalin data
elemen tersebut, kemudian menghapus elemen tersebut dari list biasanya
digunakan untuk stack.

Prima : Bilangan yang tidak memiliki faktor selain 1 dan bilangan itu sendiri.

Push : Memasukkan sebuah elemen baru ke dalam list.

Queue : Struktur list dengan sifat FIFO, cara kerjanya seperti antrian manusia.

Record : Struktur data yang terdiri dari satu atau lebih elemen yang tipe data
bias berbeda.

Rekursi : Jenis perulangan yang tidak menggunakan struktur perulangan, tetapi
dengan memanggil fungsi yang bersangkutan.

Sort : Menyusun elemen-elemen suatu list secara berurutan.

Source Code : Program yang ditulis menggunakan bahasa pemrograman
tertentu. Kode sumber belum dapat dijalankan oleh komputer dan perlu
menjalani proses kompilasi sehingga dapat dijalankan.

Stack : List yang memiliki sifar LIFO. Data yang hendak di keluarkan dari stack
haruslah data yang paling terakhir dari stack.

STL : Standar Templete Library merupakan kumpulan yang disertakan dalam
setiap compiler C++ yang memenuhi standar ANSI C++ yang menyediakan
berbagai struktur data, algoritma dan template yang sering dipakai.

Stream : Aliran merupakan konsep dalam C++ untuk input dan ouput data tanpa
memperdulikan isi data maupun media penampung data tersebut.

Struktur kontrol : Struktur yang digunakan untuk mengontrol jalannya
program.

Teks : Data yang terdiri dari karakter-karakter yang dapat dibaca (huruf
bilangan, tanda baca).

Tree : Suatu struktur data yang setiap elemen terhubung sedemikian rupa
sehingga berbentuk seperti pohon.
Contoh Program:
#include<stdio.h>
typedef struct node{
char data;
node *kiri;
node *kanan;
};
node *akar=NULL;
addNode(node **akar, char isi) {
if((*akar)==NULL){
node *baru;
baru= new node;
baru->data = isi;
baru->kiri = NULL;
baru->kanan = NULL;
(*akar)=baru;
}
}
preOrder(node *akar) {
if(akar !=NULL) {
printf("%c ", akar->data);
preOrder(akar->kiri);
preOrder(akar->kanan);
}
}
inOrder(node *akar) {
if(akar !=NULL) {
inOrder(akar->kiri);
printf("%c ", akar->data);
inOrder(akar->kanan);
}
}
postOrder(node *akar) {
if(akar !=NULL) {
postOrder(akar->kiri);
postOrder(akar->kanan);
printf("%c ", akar->data);
}
}
main(){
char abjad;
printf("\n\n\tPosisi Awal Tree:\n\n");
printf("\t B\n\t / \\\n\t U H\n\t /\n\t A\n\t / \\\n\t Y A\n\n");
addNode(&akar,abjad='B');
addNode(&akar->kiri,abjad='U');
addNode(&akar->kanan,abjad='H');
addNode(&akar->kiri->kiri,abjad='A');
addNode(&akar->kiri->kiri->kiri,abjad='Y');
addNode(&akar->kiri->kiri->kanan,abjad='A');
printf("Tampilan PreOrder : ");
preOrder(akar);
printf("\nTampilan InOrder : ");
inOrder(akar);
printf("\nTampilan PostOrder : ");
postOrder(akar);
}
Hasil output :
2.3. Pengertian Binary Transversal
Traversal
Traversal adalah proses kunjungan dalam pohon, dengan setiap node hanya
dikunjungi tepat satu kali.
Jadi, binary tree traversal adalah proses mengunjungi node tepat satu kali dan tiap
node hanya boleh memiliki maksimal 2 subtree yang disebut sebagai sub pohon kiri
(left subtree) dan sub pohon kanan (right subtree).
Dengan melakukan kunjungan secara lengkap, maka akan didapatkan urutan
informasi secara linier yang tersimpan dalam sebuah binary tree.
Binary tranversal Adalah proses menelusuri suatu Binary Tree sehingga
sedemikian rupa setiap vertex dikunjungi hanya 1 kali.
3 aktivitas dalam Binary tree Transversal :
a. Visit the Root
b. Transverse the left subtree
c. Transverse the right subtree
Algoritma dalam Binary Tree Transversal :
1.
PRE-ORDER TRANSVERSAL
a. visit the root
b. tranverse the left subtree
c. tranverse the right subtree
contoh : { PreOrder }
procedure PreOrder(Tree : NodePtr);
begin
if Tree<>nil then
begin
write(Tree^.value);
PreOrder(Tree^.left);
PreOrder(Tree^.right);
end;
end;
2. IN-ORDER TRANSVERSAL
a. tranverse the left subtree
b. visit the root
c. tranverse the right subtree
contoh :{ InOrder }
procedure InOrder(Tree : NodePtr);
begin
if Tree<>nil then
begin
InOrder(Tree^.left);
write(Tree^.value);
InOrder(Tree^.right);
end;
end;
3. POST-ORDER TRANSVERSAL
a. tranverse the left subtree
b. tranverse the right subtree
c. visit the root
Contoh : { PostOrder }
procedure PostOrder(Tree : NodePtr;
begin
if Tree<>nil then
begin
PostOrder(Tree^.left);
PostOrder(Tree^.right);
write(Tree^.value);
end;
end;
(1)
+
+
*
A
D
C
B
PRE-ORDER : V L R (+ + * A B C D)
(2)
+
+
D
*
C
A
B
IN-ORDER : L V R
A*B+C+D
(3)
+
+
*
A
D
C
B
POST-ORDER : L R V
AB*C+D+
Contoh program PRE-ORDER , IN-ORDER , POST-ORDER
#include<stdio.h>//header file
#include<conio.h>
/* Deklarasi struct */
typedef struct Node{
int data;
//data pada tree
Node *kiri; //penunjuk node anak kiri
Node *kanan; //penunjuk node anak kanan
};
/* Fungsi untuk memasukkan data ke dalam tree */
void tambah(Node **root, int databaru){
if((*root) == NULL){
//jika pohon/subpohon masih kosong
Node *baru;//node "baru" dibentuk…
baru = new Node;//berdasarkan struct "Node"
baru->data = databaru; //data node baru diisi oleh variabel databaru
baru->kiri = NULL;//penunjuk kiri node baru masih kosong
baru->kanan = NULL;//penunjuk kanan node baru masih kosong
(*root) = baru; //node pohon (root) diletakkan pada node baru
(*root)->kiri = NULL;//penunjuk kiri node root masih kosong
(*root)->kanan = NULL; //penunjuk kanan node root masih kosong
printf("Data bertambah!");
}
else if(databaru < (*root)->data)//jika databaru kurang dari data node root…
tambah(&(*root)->kiri, databaru);//tambahkan databaru pada subpohon kiri
else if(databaru > (*root)->data)//jika databaru lebih dari data node root…
tambah(&(*root)->kanan, databaru); //tambahkan databaru pada subpohon kanan
else if(databaru == (*root)->data)//jika databaru sama dengan data node root
printf("Data sudah ada!");//databaru tidak dapat ditambahkan pada tree
}
/* Fungsi untuk menampilkan data secara pre-order
(data ditampilkan dari node induk, node anak kiri, lalu node anak kanan)
*/
void preOrder(Node *root){
if(root != NULL){//jika pohon/subpohon tidak kosong
printf("%d ", root->data);//menampilkan data node yang dikunjungi
preOrder(root->kiri);//mengunjungi node anak kiri
preOrder(root->kanan); //mengunjungi node anak kanan
}
}
/* Fungsi untuk menampilkan data secara in-order
(data ditampilkan dari node anak kiri, node induk, lalu node anak kanan)
*/
void inOrder(Node *root){
if(root != NULL){//jika pohon/subpohon tidak kosong…
inOrder(root->kiri);//mengunjungi node anak kiri
printf("%d ", root->data);//menampilkan data node yang dikunjungi
inOrder(root->kanan);//mengunjungi node anak kanan
}
}
/* Fungsi untuk menampilkan data secara post-order
(data ditampilkan dari node anak kiri, node anak kanan, lalu node induk)
*/
void postOrder(Node *root){
if(root != NULL){//jika pohon/subpohon tidak kosong
postOrder(root->kiri); //mengunjungi node anak kiri
postOrder(root->kanan);//mengunjungi node anak kanan
printf("%d ", root->data); //menampilkan data node yang dikunjungi
}
}
main(){
int pil, c;
Node *pohon, *t;
pohon = NULL;
do{
int data;
printf("MENU\n");
printf("1. Tambah\n");
printf("2. Lihat Pre-Order\n");
printf("3. Lihat In-Order\n");
printf("4. Lihat Post-Order\n");
printf("5. Exit\n");
printf("Pilihan : "); scanf("%d", &pil);
switch(pil){
case 1 :
printf("Data baru : ");
scanf("%d", &data);
tambah(&pohon, data);
break;
case 2 :
if(pohon != NULL)
preOrder(pohon);
else
printf("Masih kosong!");
break;
case 3 :
if(pohon != NULL)
inOrder(pohon);
else
printf("Masih kosong!");
break;
case 4 :
if(pohon != NULL)
postOrder(pohon);
else
printf("Masih kosong!");
break;
}
getch();
printf("\n");
}
while(pil != 5);
}
Maka hasil outputnya
2.4. BALANCING BINARY SEARCH TREE(Self Balancing Binary Tree)
Self Balancing Binary Search Tree adalah pohon pencarian biner yang dapat
menyeimbangkan dirinya sendiri, yaitu meminimalisasikan kedalaman pohon, pada saat
pohon tersebut di tambahkan atau dikurangi simpulnya.
4
3
5
1
2
Gambar 2-1. Pohon Pencarian Biner Tak Seimbang
Pada umumnya dalam Self Balancing Binary Search Tree, bentuk pohon yang
seharusnya seperti gambar 2-1, akan secara otomatis diubah menjadi seperti gambar 12. Algoritma penyeimbangan pohon akan berjalan saat dimasukan simpul baru atau saat
sebuah simpul dalam pohon dihapus.
Pada umumnya Self Balancing Binary Search Tree mempunyai tinggi maksimal
sebesar [2log n] dengan n adalah jumlah simpul, hal ini disebabkan oleh pohon pasti
mempunyai ketinggian minimal dan baru akan menambah tinggi saat pohon sudah
mempunyai daun maksimal di suatu ketinggian, hal ini juga menyebabkan sebagian
besar algoritma untuk mengerjakan pohon ini mempunyai kompleksitas sebesar O(log
n).
Self Balancing Binary Search Tree sangat berguna untuk mempercepat kinerja
sebuah pohon pencarian biner, selain itu pohon ini juga mempunyai beberapa aplikasi
untuk mempermudah kinerja suatu algoritma seperti antrian dengan prioritas dan tabel
data.
Self Balancing Binary Search Tree mempunyai beberapa contoh pohon yaitu:
1. AA tree
2. AVL tree
3. Red-black tree
4. Scapegoat tree
5. Treap
2.4.1. JENIS-JENIS SELF BALANCING BINARY SEARCH TREE
A. Red-black Tree
Red-black Tree adalah salah satu jenis Self Balancing Binary Search Tree
yang diciptakan oleh Rudolf Bayer di tahun 1972 dan bernama Symmetric binary
B-tree, lalu pada tahun 1978 diperbaharui menjadi Red-black Tree oleh Leonidas J.
Guibas dan Robert Sedgewick.
Dalam Red-black Tree ini pohon, simpul ditambahkan dan dihapus dengan
algoritma khusus sehingga pohon tidak perlu menyeimbangkan dirinya.
Selain kriteria pohon pencarian biner biasa, ada beberapa kriteria tambahan berlaku
untuk Red-Black Tree:
1. Simpul bewarna merah atau hitam.
2. Akar berwarna hitam. (Aturan ini dapat dihilangkan karena akar dapat diubah
ke merah dan tidak mempengaruhi.)
3. Anak dari tiap simpul merah adalah hita
4. Setiap jalur dari akar sampai simpul sampai daun keturunannya mempunyai
jumlah simpul hitam yang sama.
11
14
44
4
2
1
7
5
15
8
Gambar 3-1. Contoh Red-black Tree
Pada pohon ini algoritma menambahkan dan mengurangkan bergantung pada
kasus dan beberapa diantaranya menggunakan rotasi pohon seperti pada gambar 3-2.
Gambar 3-2. Rotasi sebuah pohon biner
Sumber: http://www.cs.auckland.ac.nz/~jmor159/PLDS210/red_bl ack.html
Pohon ini menambahkan dan mengurangkan dengan cara melihat dimana
simpul baru akan ditambahkan dan tergantung dimana simpul tersebut ditambahkan
akan ada algoritma tersendiri.
Contoh beberapa kasus :
1) Simpul baru menjadi akar.
2) Simpul orangtua bewarna hitam.
3) Simpul orangtua bewarna merah.
B. AVL Tree
AVL Tree adalah salah satu jenis Self Balancing Binary Search Tree yang
ditemukan oleh G.M. Adelson-Velskii and E.M. Landis pada tahun 1962. Di pohon
ini terdapat balance factor yaitu nilai ketinggian anak pohon dikiri kurang
ketinggian anak pohon kanan. Dan pohon dianggap seimbang bila balance factor
bernilai -1,0, atau 1.
Dalam AVL Tree penambahan dan pengurangan dilakukan sama seperti
pohon pencarian biner biasa, hanya saja setelah penambahan atau pengurangan
tersebut akan ditambahkan prosedur rotasi pohon untuk menyeimbangkan.
Dalam penambahan atau pengurangan, pertama akan di cek balance factor
apakah -2 atau +2. Lalu setelah itu akan dicek kembali balance factor dari kedua
sub-pohon dari pohon utama. Lalu akan dilakukan rotasi sesuai kebutuhan.
Gambar 3-3. Diagram algoritma AVL Tree
Sumber: http://en.wikipedia.org/wiki/AVL_tree
Dapat dilihat pada gambar 3-3 pohon berputar sesuai dengan kedaan pohon
tersebut dan pada akhirnya pohon menjadi seimbang.
C. AA Tree
AA Tree adalah salah satu jenis Self Balancing Binary Search Tree yang
ditemukan oleh Arne Andersson. Pohon ini merupakan varian dari Red-black Tree.
Dalam pohon ini terdapat beberapa syarat seperti Red-Black Tree. Dalam
persyaratan sebagai pengganti warna digunakan bilangan level simpul.
Beberapa persyaratannya adalah:
1. Level dari daun adalah 1
2. Level dari simpul kiri harus lebih kecil dari simpul orangtua
3. Level dari simpul kanan bisa lebih kecil atau sama dengan orangtua.
4. Level dari cucu kanan selalu lebih besar dari level kakeknya
5. Simpul yang level-nya lebih besar dari satu harus mempunyai dua anak
Pada saat menambahkan atau mengurangkan pada pohon ini berlaku pengurangan
dan penambahan seperti pohon pencarian biner biasa. Hanya
saja untuk
menyeimbangakn akan ditambahkan dua prosedur yaitu Skew dan Split(Gambar 3-4).
Dan karena dua pohon tersebut aka nada keadaan dimana ada simpul horizontal untuk
sementara.
Gambar 3-4. (a) Skema Prosedur Skew. (b) Skema Prosedur Split
Sumber: http://en.wikipedia.org/wiki/AA_tree
Dalam penambahan dan pengurangan akan diadakan pengubahan level agar
pohon sesuai dengan ketentuan yang berlaku.
D. Scapegoat Tree
Scapegoat Tree adalah salah satu jenis Self Balancing Binary Search Tree
yang diciptakan oleh Igal Galperin, Jacob Tepec and Ronald L. Rivest.
Pohon pencarian biner akan dikatan seimbang beratnya jika jumlah simpul di
sub-pohon kanan sama dengan jumlah simpul di pohon kiri. Dan dari ketentuan
tersebut didapat rumus
size(left) <= α*size(node)
size(right) <= α*size(node)
Dimana size adalah jumlah node dan bila memenuhi rumus tersebut disebut
α-weight-balanced.
Selain itu sebuah pohon yang seimbang beratnya juga harus seimbang
tingginya dan dari sana didapt rumus.
height(tree) <= log1/α(NodeCount)
dan bila memenuhi rumus tersebut disebut α-height-balanced.
Dan dalam Scapegoat Tree akan selalu dipastikan pohon akan memenuhi
α-height-balanced walaupun belum dipastikan memenuhi α-weight-balanced.
α disini dapat diubah-ubah sesuai ketentuan, dan pengubahan α
berpengaruh pada kinerja pohon (apakah pohon cepat saat menambahkan atau
menghapus).
Penambahan pada pohon ini dilakukan dengan cara seperti penambahan
pada pohon pencarian biner biasa tetapi dengan penambahan scapegoat dan
perhitungan jumlah dan ketinggian simpul yang akan digunakan untuk
penyeimbangan. Dalam penghapusannya juga akan menggunakan jumlah simpul
untuk memastikan apakah penyeimbangan perlu dilakukan atau tidak.
E. Splay Tree
Scapegoat Tree adalah salah satu jenis Binary Search Tree yang dapat
menjadi Self Balancing Binary Search Tree. diciptakan Daniel Dominic Sleator and
Robert Endre Tarjan tahun 1985. Pohon ini mempunyai ketentuan tambahan yaitu
elemen yang baru saja diakses akan mudah dan cepat diakses lagi.
Semua kejadian yang diatur dalam Splay Tree disebut Splaying. Dalam
Splaying, sebuah simpul akan diatur seperti biasa lalu dilanjutkan dengan rotasi
pohon agar pohon tetap seimbang dan simpul yang mengandung elemen yang
mudah diakses tersebut dipindah menjadi akar.
Setiap kali elemen x diakses, Splay akan membawanya ke akar sehingga
terdapat beberapa dan tahap-tahap tersebut tergantung beberapa factor yaitu:

Apakah x adalah simpul kanan atau kiri dari orangtuanya(simpul p)

Apakah p akar atau bukan

Apakah p adalah simpul kanan atau kiri dari
listing 1
def _put (self, key, val, CurrentNode):
jika kunci <currentNode.key:
jika currentNode.hasLeftChild ():
self._put (key, val, currentNode.leftChild)
lain:
currentNode.leftChild = TreeNode (key, val, orang tua = CurrentNode)
self.updateBalance (currentNode.leftChild)
lain:
jika currentNode.hasRightChild ():
self._put (key, val, currentNode.rightChild)
lain:
currentNode.rightChild = TreeNode (key, val, orang tua = CurrentNode)
self.updateBalance (currentNode.rightChild)
def updateBalance (self, node):
jika node.balanceFactor> 1 atau node.balanceFactor <-1:
self.rebalance (node)
kembali
jika node.parent = Tidak:
jika node.isLeftChild ():
node.parent.balanceFactor = 1
Elif node.isRightChild ():
node.parent.balanceFactor - = 1
jika node.parent.balanceFactor = 0:
self.updateBalance (node.parent)
Metode updateBalance baru di mana sebagian besar pekerjaan dilakukan. Ini
menerapkan prosedur rekursif kita hanya dijelaskan. Metode updateBalance cek
pertama untuk melihat apakah node saat ini tidak seimbang cukup membutuhkan
rebalancing (baris 16). Jika itu terjadi maka rebalancing dilakukan dan tidak ada
update lebih lanjut untuk orang tua diperlukan. Jika node saat ini tidak memerlukan
rebalancing maka faktor keseimbangan induk disesuaikan. Jika faktor keseimbangan
induk non-nol maka algoritma terus bekerja dengan cara naik pohon ke arah akar
dengan rekursif memanggil updateBalance pada orang tua.
2.5. BOUND BALANCE
BAB III
PENUTUP
3.1. Kesimpulan
Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hirarkis (hubungan one to many) antara elemen-elemen. Tree
bisa didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang
disebut Root dan node lainnya
Istilah-istilah pada Tree
1). Predecessor
2). Successor
3). Ancestor
4). Descendant
5). Father
6). Son
7). Sibling
8). Subtree
9). Size
10). Height
11). Root
12). Leaf
13).Degree
Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh memiliki
maksimal dua sub tree dan kedua subtree tersebut harus terpisah.
Jenis-jenis Binary Tree :
a) Full Binary Tree
b) Complete Binary Tree
c) Skewed Binary Tree
Operasi-operasipada Binary Tree :

Create

Clear

Empty

Insert

Find

Update

Retrieve

Delete Sub

Characteristic

Traverse
Traversal
Traversal adalah proses kunjungan dalam pohon, dengan setiap node hanya
dikunjungi tepat satu kali.
Jadi, binary tree traversal adalah proses mengunjungi node tepat satu kali dan
tiap node hanya boleh memiliki maksimal 2 subtree yang disebut sebagai sub pohon
kiri (left subtree) dan sub pohon kanan (right subtree).
Algoritma dalam Binary Tree Transversal :
1.
Pre-order transversal
2.
In-order transversal
3.
Post-order transversal
Balancing Binary Search Tree
Self Balancing Binary Search Tree adalah pohon pencarian biner yang dapat
menyeimbangkan dirinya sendiri, yaitu meminimalisasikan kedalaman pohon, pada saat
pohon tersebut di tambahkan atau dikurangi simpulnya.
DAFTAR PUSTAKA
1. Desphande P.S., O.G. Kakde (2004). C dan Data Structures. Charles RiverMedia, Inc.
Massachusetts
2. Heriyanto, Imam, Budi Raharjo (2003). Pemrograman Borland C++ Builder. Informatika
Bandung.
3. Solichin, Achmad (2003). Pemrograman Bahasa C dengan Turbo C. IlmuKomputer.Com.
4. Lidya, Leoni, rinaldi Munir (2002). Algoritama dan Pemrograman dalam Bahas Pascal
dan C. Informatika Bandung
5. http://en.wikipedia.org/wiki/Tree_%28data_structure%29
Kamis, 28 November 2014
6. https://agungsetiady.wordpress.com/2012/05/27/binary-tree-traversal
Kamis, 28 November 2014
7. http://en.wikipedia.org/wiki/Binary_search_tree
Senin,1 Desember 2014
8. http://en.wikipedia.org/wiki/AVL_tree
Senin,1 Desember 2010
9. http://en.wikipedia.org/wiki/AA_tree
Senin, 1 Desember 2010
10. http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
Selasa, 2 Desember 2014
11. http://www.cs.auckland.ac.nz/~jmor159/PLDS210/red_bl ack.html
Selasa, 2 Desember 2014
Download