Professional Documents
Culture Documents
PENDAHULUAN
1.1 Latar Belakang Masalah
Struktur pohon (tree) biasanya digunakan untuk menggambarkan hubungan yang bersifat
hirarkis secara elemen- elemen yang ada. Contoh penggunaan struktur pohon :
• Silsilah keluarga
• Hasil pertandingan yang berbentuk turnamen
Dalam ilmu komputer, tree adalah sebuah struktur data yang secara bentuk menyerupai
sebuah pohon, yang terdiri dari serangkaian node (simpul) yang saling berhubungan. Node-node
tersebut dihubungkan oleh sebuah vektor. Setiap node dapat memiliki 0 atau lebih node anak
(child). Sebuah node yang memiliki node anak disebut node induk (parent). Sebuah node anak
hanya memiliki satu node induk. Sesuai konvensi ilmu komputer, tree bertumbuh ke bawah,
tidak seperti pohon di dunia nyata yang tumbuh ke atas. Dengan demikian node anak akan
digambarkan berada di bawah node induknya.
Mahasiswa sebagai modal dasar pembangunan diharapkan memiliki kemampuan dan
pemahaman dalam menciptakan program yang saat ini dituntut untuk mampu menguasai bahasa
pemrograman, misalnya bahasa C++. Tree merupakan salah satu struktur data yang paling
penting, karena banyak aplikasi menggunakan informasi dan data yang secara alami memiliki
struktur hirarkis berguna dalam membantu memecahkan banyak masalah algoritmis dalam
kehidupan sehari- hari.
1
BAB II
DASAR TEORI
Mulai awal tahun 1980, Bjarne Stroustrup dari AT & T Bell Laboratories mulai
mengembangkan bahasa C. Pada tahun 1985, lahirlah secara resmi bahasa baru
hasil pengembangan C yang dikenal dengan nama C++. Sebenarnya bahasa C++
mengalami dua tahap evolusi. C++ yang pertama, dirilis oleh AT&T Laboratories,
dinamakan cfront. C++ versi kuno ini hanya berupa kompiler yang
menterjemahkan C++ menjadi bahasa C.
2
bahasa berorientasi obyek yang digunakan oleh sebagian besar pemrogram
professional.
Contoh :
#include <iostream.h>
int main ()
return 0;
Hasil :
Hello World!
Sisi kiri merupakan source code, yang dapat diberi nama hiworld.cpp dan sisi
kanan adalah hasilnya setelah di-kompile dan di-eksekusi.
Program diatas merupakan salah satu program paling sederhana dalam C++,
tetapi dalam program tersebut mengandung komponen dasar yang selalu ada pada
setiap pemrograman C++. Jika dilihat satu persatu :
Baris ini adalah komentar. semua baris yang diawali dengan dua garis miring
(//) akan dianggap sebagai komentar dan tidak akan berpengaruh terhadap
program. Dapat digunakan oleh programmer untuk menyertakan penjelasan
singkat atau observasi yang terkait dengan program tersebut.
3
#include <iostream.h>
Kalimat yang diawali dengan tanda (#) adalah are preprocessor directive.
Bukan merupakan baris kode yang dieksekusi, tetapi indikasi untuk kompiler.
Dalam kasus ini kalimat #include <iostream.h> memberitahukan preprocessor
kompiler untuk menyertakan header file standard iostream. File spesifik ini
juga termasuk library deklarasi standard I/O pada C++ dan file ini disertakan
karena fungsi-fungsinya akan digunakan nanti dalam program.
int main ()
Baris ini mencocokan pada awal dari deklarasi fungsi main. fungsi main
merupakan titik awal dimana seluruh program C++ akan mulai dieksekusi.
Diletakan diawal, ditengah atau diakhir program, isi dari fungsi main akan
selalu dieksekusi pertama kali. Pada dasarnya, seluruh program C++
memiliki fungsi main. main diikuti oleh sepasang tanda kurung () karena
merupakan fungsi. pada C++, semua fungsi diikuti oleh sepasang tanda
kurung () dimana, dapat berisi argumen didalamnya. Isi dari fungsi main
selanjutnya akan mengikuti,berupa deklarasi formal dan dituliskan diantara kurung
kurawal ({}), seperti dalam contoh.
Intruksi ini merupakan hal yang paling penting dalam program contoh. cout
merupakan standard output stream dalam C++ (biasanya monitor). cout
dideklarasikan dalam header file iostream.h, sehingga agar dapat digunakan
maka file ini harus disertakan.
return 0;
4
Untuk dapat menulis program yang dapat membantu menjalankan tugas-
tugas kita, kita harus mengenal konsep dari variabel.
kita dapat mendefinisikan variable sebagai bagian dari memory untuk menyimpan
nilai yang telah ditentukan. Setiap variable memerlukan identifier yang dapat
membedakannya dari variable yang lain, sebagai contoh dari kode diatas identifier
variabelnya adalah a, b dan result, tetapi kita dapat membuat nama untuk
variabel selama masih merupakan identifier yang benar.
2.3.1 Identifiers
Identifier adalah untaian satu atau lebih huruf, angka, atau garis bawah ( _ ).
Panjang dari identifier, tidak terbatas, walaupun untuk beberapa kompiler hanya 32
karakter pertama saja yang dibaca sebagai identifier (sisanya diabaikan). Identifier
harus selalu diawali dengan huruf atau garis bawah ( _ ).
wchar_t
5
Bahasa C++ adalah bahasa yang "case sensitive", ini berarti identifier yang
dituliskan dengan huruf kapital akan dianggap berbeda dengan identifier yang
sama tetapi dituliskan dengan huruf kecil, sabagai contoh : variabel RESULT tidak
sama dengan variable result ataupun variabel Result.
Tipe data yang ada pada C++, berikut nilai kisaran yang dapat
direpresentasikan :
signed:-2147483648 to
long 4 2147483647
unsigned: 0 to 4294967295
6
Jika akan menggunakan tipe data yang sama untuk beberapa identifier maka dapat dituliskan
dengan menggunakan tanda koma, contoh :
int a, b, c;
Tipe data integer (char, short, long dan int) dapat berupa signed atau unsigned
tergantung dari kisaran nilai yang akan direpresentasikan. Dilakukan dengan
menyertakan keyword signed atau unsigned sebelum tipe data.
Misalkan kita akan mendeklarasikan variabel int dengan nama a yang bernilai 0,
maka dapat dituliskan :
int a = 0;
Atau dengan cara lainnya, yaitu menyertakan nilai yang akan diberikan dalam tanda ():
int a (0);
2.3.5 Konstanta :
Konstanta adalah ekspresi dengan nilai yang tetap. Terbagi dalam Nilai Integer, Nilai
Floating-Point, Karakter and String.
Nilai Integer
7
Merepresentasikan nilai desimal dan/atau eksponen, termasuk titik desimal dan
karakter e (Yang merepresentasikan “dikali 10 pangkat n” , dimana n merupakan
nilai integer) atau keduanya. Contoh :
'z'
Untuk karakter tunggal dituliskan diantara kutip tunggal (') dan untuk untaian
beberapa karakter, dituliskan diantara kutip ganda (").
Konstanta karakter dan string memiliki beberapa hal khusus, seperti escape
codes.
\n Newline
\r carriage return
\t Tabulation
\v vertical tabulation
\b Backspace
\f page feed
\a alert (beep)
\? question (?)
8
Kita dapat mendefinisikan sendiri nama untuk konstanta yang akan kita
pergunakan, dengan menggunakan preprocessor directive #define. Dengan format
:
Dengan prefix const kita dapat mendeklarasikan konstanta dengan tipe yang
spesifik seperti yang kita inginkan. contoh :
• Assignation (=).
Operator assignation digunakan untuk memberikan nilai ke suatu variable.
a=5
Memberikan nilai integer 5 ke variabel a. Sisi kiri dari operator disebut lvalue
(left value) dan sisi kanan disebut rvalue (right value). lvalue harus selalu
berupa variable dan sisi kanan dapat berupa konstanta, variabel, hasil dari
suatu operasi atau kombinasi dari semuanya.
• Arithmetic operators ( +, -, *, /, % )
+ addition
- subtraction
multiplicati
*
on
/ division
% module
9
contoh :
!= Different
Greater or equal
>=
than
10
• Conditional operator ( ? ).
Operator kondisional mengevaluasi ekspresi dan memberikan hasil tergantung
dari hasil evaluasi (true atau false). Sintaks :
op asm Description
AN
& Logical AND
D
| OR Logical OR
XO
^ Logical exclusive OR
R
< SH
Shift Left
< L
> SH
Shift Right
> R
int i;
float f = 3.14;
i = (int) f;
• sizeof()
11
Operator ini menerma 1 parameter, dapat berupa type variabel atau variabel itu
sendiri dan mengembalikan ukurannya type atau object tersebut dalam bytes :
a = sizeof (char);
Contoh diatas akan memberikan nilai 1ke a karena char adalah tipe data dengan
panjang 1 byte. Nilai yang diberikan oleh sizeof bersifat konstsn constant.
Ada beberapa fungsi dasar dalam fasilitas I/O, yaitu putchar dan getchar. Fungsi
putchar digunakan khusus untuk menampilkan sebuah karakter ke layar,
sedangkan getchar digunakan untuk membaca sebuah karakter. Selain fasilitas
dasar I/O, bahasa juga mempunyai fasilitas I/O yang terformat, yaitu dengan fungsi
scanf dan printf. Terformat artinya lebar dan bentuk tampilannya dapat diatur.
String control dapat berupa keterangan beserta penentu format (seperti %d, %f, dan lain-lain).
Argument adalah data yang akan ditampilkan dapat berupa variable konstanta, maupun
ungkapan.
12
2.6 Struktur Kontrol
Sebuah program biasanya tidak terbatas hanya pada intruksi yang terurut saja, tetapi juga
memungkinkan terjadinya percabangan, perulangan dan pengambilan keputusan. Untuk
mengatasi kebutuhan itu C++ menyediakan struktur kontrol yang dapat menangani hal-hal
tersebut.
Pengujian ekspresi selslu diapit dengan tanda kurung. Ekspresi dengan menggunakan
operator perbandingan akan dites nilai kebenarannya apakah benar atau salah. Pernyataan
bisa berupa perintah mencetak output, proses, atauu gabungan.
If (ekspresi1) pernyataan1;
Else if (ekspresi2) pernyataan2;
Else pernyataan3;
If (ekspresi1) pernyataan1;
If (ekspresi2) pernyataan2;
Switch (ekspresi)
{
Case item1 : pernyataan1;
Break;
Case item2 : pernyataan2;
13
Berak;
Default : pernyataan;
Break;
}
Sintaks :
Fungsi dari statement diatas adalah mengulang statement jika expression bernilai true.
Sintaks
Secara fungsional, hampir sama dengan while loop, hanya saja condition dalam do-
while dievaluasi setelah eksekusi statement , dengan kata lain, sedikitnya satu kali
eksekusi statement walaupun kondisi tidak terpenuhi.
Sintaks
Fungsinya akan mengulang statement jika condition bernilai benar. Sama seperti while
loop., hanya saja for memungkinkan untuk memberikan instruksi initialization dan
intruksi increase, sehingga dapat menampilkan loop dengan counter.
14
Algoritma perulangan for :
15
Jika expression tidak sama dengan constant1, maka akan diperiksa apakah expression
equivalen dengan constant2. jika ya, maka akan dieksekusi block of instructions 2
sampai terbaca break. Begitu seterusnya, jika tidak ada satupun konstanta yang
sesuai maka akan mengeksekusi default:
2.9 Function
Function adalah satu blok instruksi yang dieksekusi ketika dipanggil dari
bagian lain dalam suatu program. Format dari function:
Dimana :
• type, adalah tipe dari data yang akan dikembalikan/dihasilkan oleh function.
• name, adalah nama yang memungkinkan kita memanggil function.
• arguments (dispesifikasikan sesuai kebutuhan). Setiap argumen terdiri dari
tipe data diikuti identifier, seperti deklarasi variable (contoh, int x) dan
berfungsi dalam function seperti variable lainnya. Juga dapat melakukan
passing parameters ke function itu ketika dipanggil. Parameter yang berbeda
dipisahkan dengan koma.
• statement, merupakan bagian badan suatu function. Dapat berupa instruksi
tunggal maupun satu blok instruksi yang dituliskan diantara kurung kurawal
{}.
Deklarasi fungsi akan selalu diawali dengan tipe dari fungsi, yang
menyatakan tipe data apa yang akan dihasilkan dari fungsi tersebut. Jika tidak ada
nilai yang akan dikembalikan, maka dapat digunakan tipe void.
16
BAB III
TREE
Tree merupakan salah satu struktur data yang paling penting, karena banyak
aplikasi menggunakan informasi dan data yang secara alami memiliki struktur
hirarkis berguna dalam membantu memecahkan banyak masalah algoritmis.
17
Tree biasa definisikan sebagai kumpulan simpul/node dengan elemen khusus
yang disebut Root. Node lainnya terbagi menjadi himpunan-himpunan yang saling
tak berhubungan satu sama lain (disebut subtree). Apabila diamati pada setiap
subtree, akan terlihat bahwa subtree pun mempunyai root dan subtree- subtree,
dengan kata lain juga merupakan sebuah tree.
Untuk lebih jelasnya, berikut akan diuraikan istilah-istilah umum dalam tree :
tersebut.
mempunyai predecessor
18
• Degree : Banyaknya child yang dimiliki suatu node.
• Pedigree chart
• Lineal chart
• Nested parentheses
19
(N0 (N1 (N2) (N3) (N4)) (N5) (N6 (N7) (N8)))
• Bar chart
• Level-number notation
• Binary Tree
Binary tree adalah tree dengan syarat bahwa tiap node hanya boleh mimiliki 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.
20
Binary Tree adalah struktur data yang hampir mirip juga dengan Linked List
untuk menyimpan koleksi dari data. Linked list dapat dianalogikan sebagai
rantai linear, sedangkan binary tree bisa digambarkan sebagai rantai tidak
linear. Binary tree dikelompokkan menjadi unordered binary tree (tree yang
terurut) dan ordered binary tree (tree yang terurut). Ordered binary tree
yaitu sebuah tree yang di dalamnya terdapat aturan untuk menyusun node-
node dalam level yang sama, atau sebuah tree dimana setiap subtree pada
semua node di dalamnya membentuk himpunan yang berurutan (ordered
set). Urutan node-node dapat bersifat ascending (urut naik) dan dapat pula
bersifat descending (urut turun).
21
Gambaran dari Binary Tree yang terdiri dari 3 (tiga) node :
Masing-masing simpul dalam binary tree terdiri dari tiga bagian yaitu sebuah
data dan dua buah pointer yang dinamakan pointer kiri dan kanan.
Simpul juga mempunyai sibling, descendants, dan ancestors. Sibling dari sebuah simpul
adalah anak lain dari induk simpul tersebut. Descendants dari sebuah simpul adalah
semua simpul-simpul merupakan cabang (berada dibawah) simpul tersebut. Ancestors
dari sebuah simpul adalah semua simpul yang berada diatas antara simpul tersebut
dengan root. Penampilan dari sebuah tree akan ditampilkan dengan berat dari tree
tersebut, angka yang menunjukkan jumlah level yang ada didalamnya.
Tingkat suatu simpul ditentukan dengan pertama kali menentukan akar sebagai bertingkat
1. Jika suatu simpul dinyatakan sebagai tingkat N, maka simpul-simpul yang merupakan
anaknya akan berada pada tingkatan N+1. Tinggi atau kedalaman dari suatu pohon adalah
tingkat maksimum dari simpul dalam pohon dikurangi dengan 1. Selain tingkat, juga
dikenal istilah derajad (degree) dari suatu simpul. Derajad suatu simpul dinyatakan
sebagai banyaknya anak atau turunan dari simpul tersebut.
22
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree
harus mempunyai panjang path yang sama.
Jenis ini mirip dengan full binary tree, namun tiap subtree boleh memilki panjang
path yang berbeda dan setiap node kecuali leaf hanya boleh memiliki dua child.
Skewed binary tree adalah binary tree yang semua nodenya (kecuali leaf) hanya
memiliki satu child.
• Find : Mencari root, parent, left, atau right child dari suatu node
(tree tidak boleh kosong).
• Update : Mengubah isi dari node yang ditunjuk oleh pointer current
(tree tidak boleh kosong).
• Retrieve : Mengetahui isi dari node yang ditunjuk oleh pointer current
(tree tidak boleh kosong)
23
Tersimpan dalam tree. Ada tiga cara tranverse, yaitu
preorder, inorder, dan postorder
Dalam ilmu komputer, sebuah pohon biner terurut (binary search tree atau BST) adalah
sebuah pohon biner struktur data yang memiliki sifat-sifat sebagai berikut:
• Setiap simpul memiliki sebuah nilai.
• Sebuah susunan total ditentukan dalam nilai ini.
• Sub pohon kiri dari sebuah simpul hanya memuat nilai lebih kecil dari nilai
simpul.
• Sub pohon kanan dari sebuah simpul hanya memuat nilai lebih besar atau
sama dengan nilai dari simpul.
Berikut contoh pohon biner terurut dengan lebar 9 dan kedalaman 3, dengan akar 8
dan daun: 1, 4, 7 dan 13.
24
Langkah 3: Pemasukan data 7 disebelah kanan simpul 5 karena 7 > 5.
Langkah 4: Pemasukan data 1. Karena data 1 lebih kecil dari data di root yaitu 5
maka penelusuran dilanjutkan kesebelah kiri root. Kemudian karena
disebelah kiri sudah ada daun dengan nilai 3 dan data 1 lebih kecil dari data 3 maka
data 1 disisipkan disebelah kiri simpul 3.
Langkah 6: Pemasukan data 6. Karena data 6 lebih besar dari data di root yaitu 5
maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah
kanan sudah ada simpul dengan nilai 7 dan data 6 lebih kecil dari data 7 maka data
6 disisipkan disebelah kiri simpul 7.
25
Langkah 7: Pemasukan data 8. Karena data 8 lebih besar dari data di root yaitu 5
maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah
kanan sudah ada simpul dengan nilai 7 dan karena data 8 lebih besar dari data7
maka data 8 disisipkan disebelah kanan simpul 7.
Langkah 8: Pemasukan data 9. Karena data 9 lebih besar dari data di root yaitu 5
maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah
kanan bukan merupakan daun yaitu simpul dengan nilai 7 dan karena data 9 lebih
besar dari data 7, penelusuran terus dilanjutkan kesebelah kanan. Selanjutnya
ditemukan ditemukan daun dengan nilai 8, karena data 9 lebih besar dari 8 maka
data 9 disisipkan disebelah kanan simpul 8.
• Mengosongkan BST
• Mencek apakah BST kosong
26
• Mencari Tree Minimum
• Mencari Tree Maksimum
• Memasukkan data baru ke dalam BST
• Mencari elemen tertentu dalam BST
• Menghapus data tertentu dari dalam BST
• Menampilkan semua elemen dalam BST
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 disini 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. Ketentuan Delete :
- Jika yang didelete adalah leaf maka tidak perlu dilakukan modifikasi terhadap
lokasi
- Jika yang didelete adalah node yang hanya memiliki satu anak, maka anak
tersebut langsung
- Jika yang didelete adalah node dengan 2 anak (2 subtree), maka node yang
diambil mengganti
a. Berasal dari left subtree yang diambil adalah node yang paling
27
kanan (nilai terbesar)
AVL Tree
AVL Tree adalah binary search tree yang memilki perbedaaan tinggi/ level maksimal
satu 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.
• - (tanda minus) : digunakan apabila subtree kiri lebih panjang dari subtree
Kanan.
• +(tanda plus) : digunakan apabila subtree kanan lebih panjang dari subtree
Kiri.
28
Dengan demikian, penyajian pohon biner secara berurutan dalam sebuah array
adalah sebagai berikut. Akar pohon (simpul tingkat pertama) selalu menempati
elemen pertama array, simpul-simpul tingkat 2 diletakkan sebagai elemen ke-2 dan
3. Simpul-simpul pada tingkat 3 diletakkan sebagai elemen ke-4,5,6,7. Simpul-
simpul tingkat 4 diletakkan sebagai elemen ke-8 sampai ke-15. Berikut ini contoh
penyajian tree dengan array :
Cara penyimpanan seperti ini hanya baik jika pohon binernya berupa pohon biner
lengkap. Jika pohonnya tidak lengkap, pemakaian memory tidak efisien. Berikut ini
contoh penyajian pohon biner menggunakan array yang tidak efisien :
Simpul dalam pohon biner dapat disajikan dengan list sebagai berikut :
29
BAB IV
HASIL DAN PEMBAHASAN
Karena tree tersusun oleh node-node, maka yang perlu kita deklarasikan adalah
komponen node itu sendiri. Dalam contoh dibawah, akan kita namai Node.
int data;
Node *kiri;
Node *kanan;
};
30
4.2 Inisialisasi Tree
Untuk pertama kali, saat kita akan membuat sebuah pohon biner, asumsi awal
adalah pohon itu belum bertumbuh, belum memiliki node sama sekali, sehingga
masih kosong. Oleh karena itu perlu kita tambahkan kode berikut pada baris
awal fungsi Main:
Node *pohon;
pohon = NULL;
Kita mendeklarasikan sebuah pointer yang akan menunjuk ke akar pohon yang
kita buat, dengan nama *pohon. Pointer ini ditujukan untuk menunjuk struktur
bertipe Node, yang telah dibuat pada bagian 1. Karena pohon tersebut sama
sekali belum memiliki node, maka pointer *pohon ditunjukkan ke NULL.
Karena pohon yang kita buat merupakan sebuah pohon biner, maka untuk
menambahkan sebuah node, secara otomatis penambahan tersebut mengikuti
aturan penambahan node pada pohon biner:
1. Jika pohon kosong, maka node baru ditempatkan sebagai akar pohon.
2. Jika pohon tidak kosong, maka dimulai dari node akar, dilakukan proses
pengecekan berikut:
a. Jika nilai node baru lebih kecil dari nilai node yang sedang dicek, maka
lihat ke kiri node tersebut. Jika kiri node tersebut kosong (belum memiliki
kiri), maka node baru menjadi kiri node yang sedang dicek. Seandainya
kiri node sudah terisi, lakukan kembali pengecekan a dan b terhadap node
kiri tersebut. Pengecekan ini dilakukan seterusnya hingga node baru
dapat ditempatkan.
b. Jika nilai node baru lebih besar dari nilai node yang sedang dicek, maka
lihat ke kanan node tersebut. Jika kanan node tersebut kosong (belum
memiliki kanan), maka node baru menjadi kanan node yang sedang dicek.
Seandainya kanan node sudah terisi, lakukan kembali pengecekan a dan b
terhadap node kanan tersebut. Pengecekan ini dilakukan seterusnya
hingga node baru dapat ditempatkan.
31
if((*root) == NULL){
Node *baru;
baru->data = databaru;
baru->kiri = NULL;
baru->kanan = NULL;
(*root) = baru;
(*root)->kiri = NULL;
(*root)->kanan = NULL;
tambah(&(*root)->kiri,databaru);
tambah(&(*root)->kanan,databaru);
Variabel **root
else menunjukkan
if(databaru ==node mana yang sedang dicek saat ini, untuk itu
(*root)->data)
saat pemanggilan fungsi ini, variabel **root kita beri nilai pointer yang
printf("Data sudah ada!");
menunjuk ke node akar, yaitu pohon.
}
tambah(&pohon,data);
Untuk membaca dan menampilkan seluruh node yang terdapat pada pohon
biner, terdapat 3 macam cara, atau yang biasa disebut kunjungan (visit). Semua
kunjungan diawali dengan mengunjungi akar pohon. Karena proses kunjungan
ini memerlukan perulangan proses yang sama namun untuk depth (kedalaman)
yang berbeda, maka ketiganya diimplementasikan dengan fungsi rekursif.
a. Kunjungan Pre-Order.
Kunjungan pre-order dilakukan mulai dari akar pohon, dengan urutan:
32
- Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kiri tersebut.
- Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.
- Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan
proses yang sama untuk node yang dikunjungi sebelumnya.
void preOrder(Node *root){
if(root != NULL){
printf("%d ",root->data);
preOrder(root->kiri);
preOrder(root->kanan);
b. Kunjungan In-Order.
1. Kunjungi kiri node tersebut,
- Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kiri tersebut.
- Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.
- Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan
proses yang sama untuk node yang dikunjungi sebelumnya.
33
void inOrder(Node *root){
if(root != NULL){
inOrder(root->kiri);
printf("%d ",root->data);
inOrder(root->kanan);
}
c. Kunjungan Post-Order.
1. Kunjungi kiri node tersebut,
- Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kiri tersebut.
- Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.
3. Cetak isi (data) node yang sedang dikunjungi. Proses untuk node ini
selesai, tuntaskan proses yang sama untuk node yang dikunjungi
sebelumnya.
void postOrder(Node *root){
if(root != NULL){
postOrder(root->kiri);
postOrder(root->kanan);
printf("%d ",root->data);
}
Variabel **root pada setiap fungsi diatas menunjukkan node mana yang sedang
dikunjungi saat ini, untuk itu saat pemanggilan, variabel **root kita beri nilai
pointer yang menunjuk ke node akar, yaitu pohon.
preOrder(pohon);
inOrder(pohon);
postOrder(pohon);
34
BAB V
PENUTUP
5.1 Kesimpulan
Dari pembahasan laporan di atas maka dapat disimpulkan bahwa :
1. Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen.
Tree merupakan salah satu struktur data yang paling penting, karena banyak aplikasi
menggunakan informasi dan data yang secara alami memiliki struktur hirarkis berguna
dalam membantu memecahkan banyak masalah algoritmis.
2. Untuk membangun logika berpikir dan mengimplementasikan setiap permasalahan
mengenai algoritma tree dapat diselesaikan secara logis dalam bentuk bahasa
pemrograman C++.
35
DAFTAR PUSTAKA
http://id.wikipedia.org/wiki/Struktur_data
http://dharmaatmaja.Wordpress.com/tag/tree/
36
LAMPIRAN PROGRAM
Berikut ini kode program keseluruhan, termasuk menu tampilan, di mana di
dalamnya terdapat Deklarasi Tree, Inisialisasi Tree, Penambahan Node, dan
Pembacaaan serta Menampilkan Node dengan 3 macam kunjungan. Kode ditulis
dengan C++
#include <stdio.h>
#include <conio.h>
int data;
Node *kiri;
Node *kanan;
};
if((*root) == NULL){
Node *baru;
baru->data = databaru;
baru->kiri = NULL;
baru->kanan = NULL;
(*root) = baru;
37
(*root)->kiri = NULL;
(*root)->kanan = NULL;
printf("Data bertambah!");
tambah(&(*root)->kiri,databaru);
tambah(&(*root)->kanan,databaru);
if(root != NULL){
printf("%d ",root->data);
preOrder(root->kiri);
preOrder(root->kanan);
if(root != NULL){
inOrder(root->kiri);
printf("%d ",root->data);
inOrder(root->kanan);
if(root != NULL){
postOrder(root->kiri);
38
postOrder(root->kanan);
printf("%d ",root->data);
void main(){
int pil,c;
Node *pohon,*t;
pohon = NULL;
do{
clrscr();
int data;
printf("MENU\n");
printf("1. Tambah\n");
printf("5. Exit\n");
switch(pil){
&data);
tambah(&pohon,data);
break;
break;
39
break;
break; }
getch();
}while(pil!=5);
40