download

Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
BINARY SEARCH TREE
README (BACA NIH)
Seperti ADT (Abstract Data Type, masih ingat?) yang lainnya, Tree perlu
dilengkapi dengan fungsi-fungsi untuk mengoperasikannya. Salah duanya adalah fungsi
create() dan fungsi insert().
Di catatan ini saya coba jelaskan contoh program dari kedua fungsi tersebut. Kita
akan coba membuat tree menggunakan Triple-LinkList, sehingga juga saya berikan
contoh pendefinisian node-nya.
Akan jauh lebih bermanfaat seandainya kalian mencoba langsung programnya.
Lalu coba ditambahkan fungsi-fungsi yang lainnya juga ya.
SELAMAT BELAJAR
PENDAHULUAN
Binary Search Tree (BST), berarti Tree yang Binary (tiap nodenya max 2
child) dan terurut. “Urut” disini bukan berarti “pijat” tapi “letaknya teratur, yaitu :
o SubTree Kiri < Parent, dan
o SubTree Kanan > Parent
Pokoknya aturan tersebut harus tetap dipenuhi biarpun tree-nya diutak-atik (entah itu di
insert node, delete node, update, dsb). Teori lainnya, cari dan baca sendiri aja, kita
langsung bahas tentang pemrogramannya ya .
PEMROGRAMAN BST DENGAN LINKLIST
PEMBUATAN NODE
Node pada suatu tree bisa berupa Double LinkList (menggunakan 2 pointer) atau
Triple LinkList (menggunakan 3 pointer). Berikut adalah contoh pembuatan node yang
menggunakan 3 pointer :
struct node
{ int data;
struct node *parent;
struct node *kiri;
struct node *kanan;
} *root, *curr;
Pada contoh di atas, saya sekalian membuat 2 buah pointer, yaitu : root (untuk
menunjuk root) dan curr (untuk menunjuk node yang aktif).
PEMBUATAN FUNGSI
1
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
Fungsi CREATE()
Kita mulai dari yang paling simple dulu. Karena pada contoh ini, program kita
hanya berisikan 1 tree aja yang bersifat global, termasuk pointer-pointernya juga global,
maka fungsi Create ini sebenernya gak bener-bener membuat tree yang baru, melainkan
hanya menyiapkan pointer root dan curr nya saja.
void create(void)
{ root = NULL;
curr = NULL;
};
He he he 
Ternyata gampang ya ?!
Fungsi INSERT()
Fungsi ini gunanya untuk memasukan 1 node ke Tree. Judul fungsinya akan saya
tuliskan seperti ini :
int insert(int x)
{
Fungsi insert ini saya maksudkan untuk me-return 0 jika gagal, dan me-return 1
jika sukses. Itulah sebabnya tipe fungsinya tidak saya jadikan void. Parameter X akan
menampung nilai data node tersebut.
Kemudian isi fungsi insert tsb adalah :
struct node *nodebaru, *temp;
nodebaru = (struct node*) malloc(sizeof(struct node));
nodebaru->data = x;
nodebaru->kiri = NULL;
nodebaru->kanan = NULL;
curr = nodebaru;
…1
…2
…3
…4
…5
…6
1. Buat node baru bernama nodebaru. Sedangkan temp adalah node sementara aja
untuk mencari posisi nantinya.
2. Siapakan tempat kosong untuk nodebaru.
3. Set data pada nodebaru dengan x.
4. Set pointer kiri pada nodebaru dengan NULL (karena nodebaru pasti diinsert sebagai Leaf dan pasti belum punya anak kiri).
5. Set pointer kanan pada nodebaru dengan NULL (penjelasan idem).
6. Pointer curr menunjuk data terbaru.
2
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
Pusing ?? Istirahat bentar deh. Coba aja langsung ketik di Borland C, test langsung.
if (root == NULL)
{ nodebaru->parent = NULL;
root = nodebaru;
}
7. Kalau root-nya maih NULL (berarti masih kosong tuh Tree), maka…
8. parent-nya si nodebaru gak ada alias NULL.
9. Set pointer root ke nodebaru tsb.
…7
…8
…9
Sampai disini, maka secara logic jika nodebaru ternyata masuk sebagai root, kira-kira
visualisainya sebagai berikut :
Oke, siap ? Kita lanjutkan :
else
{
10. Kalau gak NULL, maka…
..10
// cari posisi dulu
..11
temp = root;
..12
while(
((nodebaru->data < temp->data)&&(temp->kiri!=NULL))
||
..13
((nodebaru->data > temp->data)&&(temp->kanan!=NULL))
)
{
if (nodebaru->data == temp->data) return 0;
..14
else if(nodebaru->data < temp->data)temp = temp->kiri;
..15
else if(nodebaru->data > temp->data)temp = temp->kanan; ..16
};
// selesai perulangan
..17
11. nodebaru akan diletakkan sebagai child-nya suatu node. Nah kita cari dulu node
mana yang berhak jadi bokapnya tuh nodebaru. Untuk itu, kita pakai bantuan pointer
temp tadi. Suruh si pointer temp menjelajahi Tree (ingat aturan BST, kalo lebih
kecil ke kiri, kalo lebih besar ke kanan, kalo sama berarti udah ada).
12. temp mulai menjelajah dari root.
13. Ingat tujuan penjelajahan ini adalah mencari posisi nodebaru. Penjelajahan ini akan
3
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
terus dilakukan selama :
a. nodebaru < temp dan kiri-nya temp belum NULL, atau
b. nodebaru > temp dan kanan-nya temp belum NULL.
Yang dilakukan pada penjelajahan ini adalah :
14. Jika ternyata temp = nodebaru, maka langsung keluar dari fungsi dan me-returnvalue 0.
15. Jika nodebaru < temp, maka pindahkan temp ke kiri-nya.
16. Jika nodebaru > temp, maka pindahkan temp ke kanan-nya.
17. Pada saat penjelajahan ini berakhir, maka si temp sudah terletak pada node yang
siap menjadi parent bagi si nodebaru, atau sudah keluar dari fungsi.
Stop ! Yang pusing peganggan dulu. Istirahat bentar. Tetap bernapas. Lalu coba pahami
lagi maksud pengulangan diatas. Kalau sudah “Ooo..” baru lanjutkan…
Sebagai contoh lihat visualisasi berikut :
Misalkan aja ada data 30 mau masuk. Maka untuk kita cari posisi dimulai dari temp kita
letakkan di root (gambar kiri). Lalu lakukan perulangan, temp menyelusuri tree (berdasarkan
besar atau kecilnya data). Setelah pencarian maka posisi temp sudah siap jadi bapak, eh jadi
parent.
Nb : Walau warna link untuk root dan temp saya bedain warnanya dengan warna link yang
lain, cuma agar enak dilihat aja, bukan berarti linknya beda.
Walau NULL nya digambarkan banyak, bukan berarti NULL nya ada banyak, Cuma
agar gak ribet aja gambarnya. Lagian NULL itu kan bagaikan kosong, hampa, gak
bisalah kekosongan atau kehampaan itu dipilah-pilah (he he he dalam ya pemikirannya).
if (nodebaru->data == temp->data) return 0;
else if (nodebaru->data < temp->data)
{ temp->kiri = nodebaru;
nodebaru->parent = temp;
..18
..19
..20
..21
4
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
}
else if (nodebaru->data > temp->data)
{ temp->kanan = nodebaru;
nodebaru->parent = temp;
}
..22
..23
..24
18. Jika setelah perulangan ternyata data-nya nodebaru sama dengan data-nya
temp, maka langsung keluar fungsi dengan me-return-value 0.
19. Kalau gak, jika nodebaru < temp, maka lakukan langkah 20 dan 21.
20. Set kiri-nya temp ke nodebaru.
21. Set parent-nya nodebaru ke temp.
22. Kalau gak, jika nodebaru > temp, maka lakukan langkah 23 dan 24.
23. Set kanan-nya temp ke nodebaru.
24. Set parent-nya nodebaru ke temp.
Melanjutkan contoh tadi di atas :
Ini gambaran setelah kiri-nya temp
dihubungkan dengan nodebaru, dan
parent-nya nodebaru dihubungkan
dengan temp.
Iseng-iseng : Ada yang bingung kenapa
posisi nodebaru kok bisa langsnug
pindah ke bawah tree, padahal di
gambar atas masih di samping tree?
Karena ini cuma visualisasi aja. Di
contoh program ini, belum ditambahkan
perintah-perintah untuk menampilkan
tree.
Lanjut, programnya nih :
}; //end else
return 1;
};
25. Selesai else-nya langkah 10.
26. Keluar fungsi dengan me-reutrn-value 1.
27. Selesai deh .
..25
..26
..27
Source Code Lengkap
Souce-code dibawah ini merupakan penggabungan fungsi-fungsi tadi. Code yang
saya beri warna merah, itu tambahan untuk mencetak posisi data secara simple banget.
Silahkan kalian modif sesuka kalian.
5
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
SELAMAT MENCOBA
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
struct node
{ int data;
struct node *parent;
struct node *kiri;
struct node *kanan;
} *root, *curr;
void create(void)
{ root = NULL;
curr = NULL;
};
int insert(int x)
{ struct node *nodebaru, *temp;
nodebaru = (struct node*) malloc(sizeof(struct node));
nodebaru->data = x;
nodebaru->kiri = NULL;
nodebaru->kanan = NULL;
curr = nodebaru;
if (root == NULL) //maka diinsert sebagai root
{ nodebaru->parent = NULL;
root = nodebaru;
printf("%d ROOT\n",x);
}
else
{ temp = root;
while(
((nodebaru->data < temp->data)&&(temp->kiri!=NULL))
||
((nodebaru->data > temp->data)&&(temp->kanan!=NULL))
)
{ if (nodebaru->data == temp->data) return 0;
else if (nodebaru->data < temp->data)
temp = temp->kiri;
else if (nodebaru->data > temp->data)
temp = temp->kanan;
};
if (nodebaru->data == temp->data) return 0;
else if (nodebaru->data < temp->data)
6
Binary Search Tree
Oleh : Chandra Liestiawan, S.Kom (D2629)
{ temp->kiri = nodebaru;
nodebaru->parent = temp;
printf("%d Left Child dari %d\n",x,temp->data);
}
else if (nodebaru->data > temp->data)
{ temp->kanan = nodebaru;
nodebaru->parent = temp;
printf("%d Right Child dari %d\n",x,temp->data);
}
};
return 1;
};
void main(void)
{ clrscr();
create();
insert(5);
insert(2);
insert(9);
insert(6);
insert(7);
insert(8);
insert(1);
insert(3);
insert(4);
insert(0);
getch();
}
7