BAB I 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
•
Striktur organisasi dari sebuah perusahaan
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. Mahasis Mahasiswa wa sebagai sebagai modal modal dasar dasar pembang pembangunan unan dihara diharapka pkan n memili memiliki ki kemamp kemampuan uan dan pemahaman dalam menciptakan program yang saat ini dituntut untuk mampu menguasai bahasa pemro pemrogra graman man,, misaln misalnya ya bahasa bahasa C++. C++. Tree Tree merupak merupakan an salah salah satu satu strukt struktur ur data data yang yang paling paling penting, karena banyak aplikasi menggunakan informasi dan data yang secara alami memiliki strukt struktur ur hirark hirarkis is berguna berguna dalam dalam membant membantu u memeca memecahka hkan n banyak banyak masala masalah h algori algoritmi tmiss dalam dalam kehidupan sehari- hari.
1.2 Rumusan Masalah Rumusan masalah yang akan dibahas dalam laporan ini adalah bagaimana menciptakan suatu algoritma tree yang selanjutnya dapat diimplementasikan dalam ba hasa pemograman C++.
1.3 Maksud dan Tujuan Adapun maksud dan tujuan dari pembuatan laporan ini adalah sebagai berikut : a. Sebagai Sebagai bahan terapan terapan dari teoriteori- teori teori yang telah telah dipraktekk dipraktekkan an dan dipelajari dipelajari dalam dalam mata mata kuliah struktur data khususnya pembahasan tentang tree. b. Untu Untuk k lebi lebih h mema memaha hami mi baga bagaim imana ana komput komputer er mamp mampu u meng menger erja jakan kan peri perint ntah ah yang yang dimasukkan dan memahami logika jalannya program. c. Sebagai Sebagai syarat syarat untuk mendapat mendapatkan kan nilai akhir akhir semester semester dari dari mata mata kuliah praktek praktek struktur struktur data.
1
BAB II DASAR TEORI
2.1 Pengantar Bahasa C++ T Tah ahun un 1978 1978,, Bria Brian n W. Ke Kern rnin ingh ghan an & Denn Dennis is M. Ritc Ritchi hie e dari dari AT & T Labo Labora rato tori ries es meng mengem emba bang ngka kan n baha bahasa sa B menj menjad adii baha bahasa sa C. Baha Bahasa sa B yang yang diciptakan oleh Ken Thompson sebenarnya merupakan pengembangan dari bahasa BCPL BCPL ( Basic Basic Combin Combined ed Progra Programm mming ing Langu Language age ) yang yang dicipt diciptaka akan n oleh oleh Marti Martin n Richard. Sejak tahun 1980, bahasa C banyak digunakan pemrogram di Eropa yang sebelumnya menggunakan bahasa B dan BCPL. Dalam perkembangannya, bahasa C menjadi bahasa paling populer diantara bahasa lainnya, seperti PASCAL, BASIC, FORTRAN. Tah Tahun un 1989 1989,, duni dunia a pemr pemrog ogra rama man n C meng mengal alam amii peri perist stiw iwa a pent pentin ing g deng dengan an dikeluarkannya dikeluarkannya standar bahasa C oleh American National Standards Institute (ANSI). Bahasa C yang diciptakan Kerninghan & Ritchie kemudian dikenal dengan nama ANSI C. 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. Pada Pada evol evolus usii sela selanj njut utny nya, a, Borl Borlan and d Inte Intern rnat atio iona nall Inc. Inc. meng mengem emba bang ngka kan n kompiler C++ menjadi sebuah kompiler yang mampu mengubah C++ langsung menjadi bahasa mesin (assembly). Sejak evolusi ini, mulai tahun 1990 C++ menjadi
2
bahasa bahasa berori berorient entas asii obyek obyek yang yang diguna digunakan kan oleh oleh sebagi sebagian an besar besar pemrog pemrogra ram m professional.
2.2 Struktur Bahasa C++
Contoh
:
// my first program in C++
#include int main () { cout << "Hello World!"; 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 setiap pemrogram pemrograman an C++. Jika dilihat dilihat satu satu persatu persatu :
// my first program in C++
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
Kalimat yang diawali dengan tanda (#) adalah are preprocessor preprocessor directive. Bukan merupakan baris kode yang dieksekusi, tetapi indikasi untuk kompiler. Dalam kasus ini kalimat #include memberitahukan memberitahukan preprocessor 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 Baris ini mencocokan mencocokan pada awal awal dari deklaras deklarasii 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 sela selalu lu diek diekse seku kusi si pert pertam ama a ka kali li.. Pada Pada dasa dasarn rnya ya,, selu seluru ruh h prog progra ram m C++ C++ memiliki fungsi main. main diikuti oleh sepasang tanda kurung () karena merupaka merupakan n fungsi. fungsi. pada C++, semua semua fungsi fungsi diikuti diikuti oleh sepasang sepasang tanda tanda kurung () dimana, dimana, dapat dapat berisi berisi argumen argumen didalamn didalamnya. ya. Isi dari fungsi main selanjutny selanjutnyaa akan mengikuti mengikuti , berup berupaa deklar deklarasi asi formal formal dan dituli dituliska skan n dianta diantara ra kurung kurung kurawal ({}), seperti dalam contoh.
cout << "Hello World";
Intruksi ini merupakan hal yang paling penting dalam program contoh. cout merupaka merupakan n standard standard output output stream stream dalam dalam C++ (biasan (biasanya ya monitor) monitor).. cout dideklarasikan dideklarasikan dalam header file iostream.h, sehingga agar dapat digunakan maka file ini harus disertakan.
return 0;
Intruksi return menyebabkan fungsi main() berakhir dan mengembalikan kode yang mengikuti instruksi tersebut, dalam kasus ini 0. Ini merupakan cara yang paling sering digunakan untuk mengakhiri program.
2.3 Variabel, Tipe Data, Konstanta
4
Untuk dapat menulis program yang dapat membantu menjalankan tugastugas kita, kita harus mengenal konsep dari variabel. kita dapat mendefinisikan variable sebagai bagian dari memory untuk menyimpan nilai nilai yang telah ditentuka ditentukan. n. Setiap Setiap variable variable memerluk memerlukan an identifier yang dapat membedakannya dari variable yang lain, sebagai contoh dari kode diatas identifier variabelnya variabelnya adalah a, b dan result , tetapi tetapi kita dapat dapat membu membuat at nama nama untuk 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 ( _
Ketentuan Ketentuan lainnya lainnya yang harus harus diperhat diperhatikan ikan dalam dalam menentuka menentukan n identifie identifierr adalah adalah tidak boleh menggunakan key word dari bahasa C++. Diawah ini adalah key word dalam C++
Asm
auto
Bool
break
case
Catch
char
Class
const
const_cast
Continue
default
Delete
do
double
dynamic_cast
else
Enum
explicit
extern
False
float
For
friend
goto
If
inline
Int
long
mutable
namespace
new
Operator
private
protected
Public
register
reinterpret_cast
return
short
Signed
sizeof
Static
static_cast
struct
Switch
template
This
throw
true
Try
typedef
Typeid
typename
union
Unsigned
using
Virtual
void
volatile
wchar_t
5
Bahas Bahasa a C++ adalah adalah bahas bahasa a yang yang "case "case sensit sensitive ive", ", ini berarti berarti identif identifier ier yang dituliska dituliskan n dengan dengan huruf huruf kapital kapital akan dianggap dianggap berbeda dengan dengan identifi identifier er yang yang sama tetapi dituliskan dengan huruf kecil, sabagai contoh : variabel RESULT tidak sama dengan variable result ataupun variabel Result .
2.3.2 Tipe Data
Tipe data yang ada direpresentasikan :
pada
Name
C++,
Bytes*
berikut
nilai
kisaran
yang
dapat
Range* signed: -128 to 127
char
1 unsigned: 0 to 255
2
signed: -327 -32768 68 to 3276 32767 7 unsigned: 0 to 65535
long
4
signed:-2147483648 to 2147483647 unsigned: 0 to 4294967295
int
*
See short, long
float
4
3.4e + / - 38 (7 digits)
double
8
1.7e + / - 308 (15 digits)
short
long double 10
1.2e + / - 4932 (19 digits)
bool
1
true or false
wchar_t
2
wide characters
2.3.3 Deklarasi variabel Untuk menggunakan variabel pada C++, kita harus mendeklarasikan tipe data yang akan digunaka digunakan. n. Sintaks Sintaks penulisa penulisan n deklarasi deklarasi variabel variabel adalah adalah dengan dengan menuliskan tipe data yang akan digunakan diikuti dengan identifier yang benar, contoh : int a
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 tergan tergantun tung g dari dari kisara kisaran n nilai nilai yang yang akan akan direpr direprese esenta ntasik sikan. an. Dilaku Dilakukan kan dengan dengan menyertakan keyword signed atau unsigned sebelum tipe data.
2.3.4 Inisialisasi Variabel Ketika mendeklarasikan variabel local, kita dapat memberikan nilai tertentu. Sintaks penulisan sbb :
type identifier = initial_value ;
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 (): type identifier (initial_value) ;
Contoh : int a (0); 2.3.5 Konstanta : Konstanta adalah ekspresi dengan nilai yang tetap. tetap. Terbagi dalam Nilai Integer, Integer, Nilai Floating-Point, Karakter and String.
Nilai Integer
Merupakan nilai konstanta numerik yang meng-identifikasikan meng-identifikasikan nilai integer decimal. Karena merupakan nilai numeric, maka tidak memerlukan tanda kutip (") maupun karakter khusus lainnya C++ C++ memu memung ngki kin nka kan n kita kita untu untuk k mempe emperg rgun unak akan an nilai ilai ok okta tall (bas (base e 8) dan dan heksa heksades desima imall (base (base 16). 16). Jika Jika mengg mengguna unakan kan octal octal maka maka harus harus diawa diawali li dengan dengan karakter 0 (karakter nol), dan untuk heksadesimal diawali dengan karakter 0x (nol, x). Nilai Floating Point
7
Merepres Merepresenta entasika sikan n nilai nilai desimal desimal dan/atau dan/atau eksponen, eksponen, termasuk termasuk titik desimal desimal dan karakter e (Yang merepresentasikan “dikali 10 pangkat n” , dimana n merupakan nila nilaii inte intege ger) r) ata atau u kedu keduan anya ya.. Cont Contoh oh :
Karakter dan String Merupa Merupakan kan konst konstant anta a nonnon-num numeri erik, k, Cont Contoh oh
:
'z' Untuk Untuk karakter karakter tunggal tunggal dituliskan dituliskan diantara diantara kutip tunggal tunggal (') dan untuk untaian beberapa karakter, dituliskan diantara kutip ganda (").
Konst Konstan anta ta karakt karakter er dan string string memili memiliki ki bebera beberapa pa hal khusus khusus,, sepert sepertii escape codes.
\n
Newline
\r
carriage return
\t Tabulation \v vertical tabulation \b
Backspace
\f
page feed
\a
alert (beep)
\'
single quotes (')
\"
double quotes (")
\?
question (?)
\\
inverted slash (\)
Konstanta Define (#define )
8
Kita Kita dapa dapatt mend mendef efin inis isik ikan an send sendir irii nama nama untu untuk k ko kons nsta tant nta a yang ang ak akan an kita kita pergunakan, dengan menggunakan preprocessor directive #define . Dengan format : #define identifier value
Deklarasi Konstanta (const)
Dengan Dengan prefix prefix const kita kita dapat dapat mendek mendeklar laras asika ikan n konsta konstanta nta dengan dengan tipe tipe yang yang spes spesif ifik ik sepe sepert rtii yan yang g kit kita a ing ingin inka kan. n. cont contoh oh : const int width = 100;
2.4 Operator Operator Operator-oper -operator ator yang disediak disediakan an C++ berupa berupa keyword atau atau karakt karakter er khusus. khusus. Operator Operator-oper -operator ator ini cukup cukup penting penting untuk untuk diketahui diketahui karena karena merupaka merupakan n salah satu dasar bahasa C++.
Assignation (=). Operator 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 variable dan sisi kanan dapat berupa berupa konstanta, variabel, variabel, hasil dari suatu operasi atau kombinasi dari semuanya. •
Arithmetic operators ( +, -, *, /, % ) + additi addition on
- subtra btrac ctio tion *
multiplicati on
/ division %module
Compound assignation operators (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
9
contoh
:
value += increase; equivalen dengan value = value + increase; a -= 5; equivalen dengan a = a - 5; a /= b; equivalen dengan a = a / b; price *= units + 1; equivalen dengan price = price * (units + 1); Increase (++) and decrease ( --) Operator Operator Increase Increase dan Decrease Decrease dapat dapat digunaka digunakan n sebagai sebagai prefix atau suffix . Deng Dengan an ka kata ta lain lain dapa dapatt ditu dituli lisk skan an sebe sebelu lum m iden identi tifi fier er vari variab abel el (++a) atau sesuda sesudahny hnya a (a++). oper operat ator or incr increa ease se yang yang digu diguna naka kan n seba sebaga gaii prefix (++a), Perbedaannya terlihat terlihat pada tabel dibawah ini : •
Relational operators ( ==, !=, >, <, >=, <= ) Untuk Untuk mengev mengevalu aluasi asi antara antara 2 ekspre ekspresi, si, dapat dapat diguna digunakan kan operato operatorr Relasi Relasiona onal. l. Hasil Hasil dari dari operator ini adalah nilai bool bool yaitu hanya berupa true atau false, atau dapat juga dalam nilai int, 0 untuk mereprensentasikan "false" dan 1 untuk merepresentasikan "true". Operato Operator-o r-oper perato atorr relasi relasiona onall pada C++ : == Equal •
!=
Different
>
Greater than
<
Less than
>=
Greater or equal than
<=
Less or equal than
Logic operators ( !, &&, || ). Oper Operat ator or ! equi equiva vale len n deng dengan an oper operas asii bool boolea ean n NO NOT, T, hany hanya a memp mempun unya yaii 1 opera operand, nd, bergun berguna a untuk untuk membal membalikk ikkan an nilai nilai dari dari opera operand nd yang yang bersa bersangk ngkuta utan. n. Contoh : •
operator operator Logika Logika && dan || diguna digunakan kan untuk untuk menge mengeval valua uasi si 2 ekspre ekspresi si dan menghasi menghasilkan lkan 1 nilai nilai akhir. akhir. mempunya mempunyaii arti yang sama sama dengan dengan operator operator logika logika Boolean AND dan OR. 10
Conditional operator ( ? ). Operator kondisional mengevaluasi ekspresi dan memberikan hasil tergantung dari hasil evaluasi ( true atau false). Sintaks : •
condition ? result1 : result2 Bitwise Operators ( &, |, ^, ~, <<, >> ). Operator Operator Bitwise Bitwise memodifi memodifikasi kasi variabel variabel menurut menurut bit yang yang merepres merepresentas entasikan ikan nilai yang disimpan, atau dengan kata lain dalam representasi binary. •
op asm asm Descr Descript iption ion &
AN Logical AND D
|
OR Logical OR
^
XO Logical exclusive OR R
~
NO Complement to one (bit T inversion)
< SH Shift Left < L > SH Shift Right > R
Explicit type casting operators Type casting operators memungkinkan untuk mengkonversikan tipe data yang sudah diberikan ke tipe data yang lain. Ada beberapa cara yang dapat dilakukan dalam C++, yang yang paling popular popular yaitu tipe baru dituliskan dituliskan dalam tanda kurung () contoh:
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 mengembalikan ukurannya ukurannya type atau object tersebut 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.
2.5 Operasi Input Output Mema Memasu sukk kkan an data data dan dan mena menamp mpil ilka kann nnya ya meru merupa paka kan n hal hal yang yang seri sering ng dilakukan dalam pemrograman. Salah satu jenis pernyataan yang hampir selalu diguna digunakan kan pada pada tiap tiap progra program m adala adalah h pernya pernyataa taan n pemang pemanggil gilan an fungs fungsii untuk untuk keperl keperluan uan input/ input/out output put.. Untuk Untuk opera operasi si input/ input/ output output dibutu dibutuhka hkan n prapr prapros osess essor or berupa #include Ada beberapa fungsi dasar dalam fasilitas I/O, yaitu putchar dan getchar. Fungsi putc putcha harr digu diguna naka kan n khus khusus us untu untuk k mena menamp mpil ilka kan n sebu sebuah ah ka kara rakt kter er ke laya layar, r, sedangka sedangkan n getchar getchar digunakan digunakan untuk untuk membaca membaca sebuah sebuah karakter. karakter. Selain fasilita fasilitas s 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.
2.5.1 fungsi printf Fungsi printf() merupakan fungsi yang digunakan untuk menampilkan berbagai jenis data yang dapat diformat diformat karena fungsi fungsi ini dapat menggunakan kode-kode kode-kode format, yaitu yaitu karakterkarakter konversi. Bentuk umum fungsi ini adalah : Printf (“string control “, argumen1, argumen2,…);
String control dapat berupa keterangan beserta penentu format (seperti %d, %f, dan lain-lain). Argum Argument ent adal adalah ah data data yang yang akan akan dita ditamp mpil ilkan kan dapa dapatt berupa berupa vari variab able le kons konsta tant nta, a, maup maupun un ungkapan. 2.5.2 fungsi scanf Fungsi scanf() merupakan fungsi yang digunakan untuk memasukkan berbagai jenis data. Fungsi ini mirip dengan printf. Fungsi scanf ini ada yang sudah ditentukan dari dalam program, namun ada juga yang membaca masukan dari keyboard, artinya ditentukan oleh pemakai melalui masukan dari keyboard.
12
2.6 Struktur Kontrol Sebuah program biasanya tidak terbatas hanya pada intruksi yang terurut saja, tetapi juga memungk memungkink inkan an terjad terjadiny inyaa percab percabanga angan, n, perula perulangan ngan dan pengamb pengambil ilan an keputu keputusan san.. Untuk Untuk mengat mengatasi asi kebutuh kebutuhan an itu itu C++ menyed menyediak iakan an strukt struktur ur kontrol kontrol yang yang dapat dapat menang menangani ani hal-ha hal-hall tersebut. 2.6.1 Struktur kondisionsal if Perintah if digunakan untuk mewujudkan percabangan bersyarat. Instruksi if tunggal • If (ekspresi) pernyataan;
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. •
Instruksi if dengan else If (ekspresi) pernyataan1; Else pernyataan2; Operator lain yang sering digunakan adalah ternary (?) (?) yang mempunyai bentuk :
(ekspresi) ? pernyataan1 : pernyataan2 ; Perintah diatas mempunyai nilai yang sama dengan perintah berikut : If (ekspresi) pernyataan1 else pernyataan2; •
Instruksi if dengan pilihan if lainnya
If (ekspresi1) pernyataan1; Else if (ekspresi2) pernyataan2; Else pernyataan3; •
Instruksi if di dalam instruksi if
If (ekspresi1) pernyataan1; If (ekspresi2) pernyataan2; 2.6.2. instruksi switch Instru Instruksi ksi switch switch diranca dirancang ng untuk untuk menanga menangani ni pegenda pegendalia lian n progra program m yang yang meliba melibatka tkan n banya banyak k altern alternati ative. ve. Biasan Biasanya ya banyak banyak digunak digunakan an untuk untuk mengga mengganti ntikan kan instru instruksi ksi if-els if-elsee yang yang bertingkat. Bentuk umum instruksi switch adalah :
Switch (ekspresi) { Case item1 : pernyataan1; Break; Case item2 : pernyataan2;
13
Default
Berak; : pernyataan; Break;
}
2.7 Struktur Perulangan (Loops) Loops merupakan perulangan statement dengan jumlah tertentu jika kondisi terpenuhi.
2.7.1 The
Sintaks
while
loop.
:
while (expression) statement
Fungsi dari statement diatas adalah mengulang statement jika expression bernilai true.
2.7.2 The
do-while
loop.
Sintaks do statement while (condition);
Secara fungsional, hampir sama dengan while loop, hanya saja condition dalam dowhile dievaluasi dievaluasi setelah eksekusi statement , dengan kata lain, sedikitnya satu kali eksekusi statement walaupun kondisi tidak terpenuhi.
2.7.3 The
for loop.
Sintaks for (initialization; condition; increase) statement ;
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 : 1. initialization, digunakan untuk memberikan nilai awal untuk variable counter. Dieksekusi hanya sekali. 2. condition, Dievaluasi, jika bernilai true maka loop berlanjut, sebaliknya loop statement diabaikan berhenti dan statement diabaikan 3. statement, dieksekusi, bisa berupa instruksi tunggal maupun blok instruksi (dalam tanda { } ). 4. kemudian algoritma kembali ke step 2.
2.8 Kontro Kontroll Percaba Percabanga ngan n (Bifur (Bifurcat cation ion)) dan dan Lompat Lompatan an (jumps)
2.8.1 Instruksi break
Dengan menggunakan instruksi break, program akan keluar dari loop walaupun kondisi untuk berakhirnya loop belum terpenuhi. Dapat digunakan untuk mengakhiri infinite loop, atau untuk menyebabkan loop selesai sebelum saatnya.
2.8.2 Instruksi continue
Instruksi continue menyebabkan program akan melewati instruksi selanjutnya hingga akhir blok dalam loop. Atau dengan kata lain langsung melompat ke iterasi selanjutnya. selanjutnya.
2.8.3 Instruksi goto
Menyebabkan lompatan dalam program. Tujuan dari lompatan diidentifikasikan diidentifikasikan dengan label, yang berisikan argumen-argumen. penulisan label diikuti dengan tanda colon (:).
2.8.4 Struktur Seleksi :
switch.
Instruksi switch digunakan untuk membandingkan membandingkan beberapa nilai konstan yang mungkin untuk sebuah ekspresi, hampir sama dengan if dan else if . switch meng-evaluasi expression dan memeriksa apakah equivalen dengan constant1, jika ya, maka akan meng-eksekusi block of instructions 1 sampai terbaca keyword break , ke kemu mudi dian an prog progra ram m ak akan an lomp lompat at ke ak akhi hirr dari dari stuk stuktu turr sele selekt ktif if swit switch ch..
15
Jika expression tidak sama dengan constant1, maka akan diperiksa apakah expression block of instr instruct uction ionss 2 equivalen dengan constant2. jika jika ya, ya, maka maka akan akan diekse dieksekus kusii block sampai terbaca break . Begitu seterusnya, jika tidak ada satupun konstanta yang sesuai maka akan mengeksekusi default:
2.9 Function Function Function adalah satu blok instruks instruksii yang dieksekusi dieksekusi ketika dipanggil dipanggil dari bagian lain dalam suatu program. Format dari function: type name ( argument1, argument2, ...) statement
Dimana : type, adalah tipe dari data yang akan dikembalikan/dihasilkan dikembalikan/dihasilkan oleh function . name, adalah nama yang memungkinkan kita memanggil function. arguments (dispesif (dispesifikas ikasikan ikan sesuai sesuai kebutuhan kebutuhan). ). Setiap Setiap argumen argumen terdiri terdiri dari tipe tipe data data diikut diikutii ident identifi ifier, er, sepert sepertii deklar deklarasi asi varia variabl ble e (conto (contoh, h, int x) dan dan berfungsi berfungsi dalam function function seperti seperti variabl variable e lainnya. lainnya. Juga dapat dapat melakukan 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 {}. • • •
•
Function
tanpa tipe (Kegunaan
void )
Dekl Deklar aras asii fung fungsi si ak akan an sela selalu lu diaw diawal alii denga engan n tip tipe dari dari fung fungs si, yang ang menyatakan tipe data apa yang akan dihasilkan dari fungsi tersebut. Jika tidak ada nilai yang akan dikembalikan, dikembalikan, maka dapat digunakan tipe void.
16
BAB III TREE
3.1
Definisi Tree
Tre Tree e merup erupak akan an sala salah h satu satu bent bentuk uk stru strukt ktur ur data data tida tidak k line linear ar yang yang menggambarkan hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree Tree merup merupaka akan n salah salah satu satu strukt struktur ur data data yang yang paling paling penti penting, ng, karena karena banya banyak k aplikasi aplikasi mengguna menggunakan kan informa informasi si dan data yang secara alami alami memiliki memiliki struktur hirarkis berguna dalam membantu memecahkan banyak masalah algoritmis. Contoh sederhana tree:
17
Tree biasa definisikan sebagai kumpulan simpul/node dengan elemen khusus yang disebut Root. Node lainnya terbagi menjadi himpunan-himpunan yang saling tak berhubun berhubungan gan satu sama lain (disebut (disebut subtree) subtree).. Apabila Apabila diamati pada setiap 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 istilah-istilah umum dalam tree :
•
Predecessor
:
Node yang berada diatas node tertentu
•
Successor
:
Node yang berada dibawah node tertentu
•
Ancestor
:
Seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang sama.
•
Descendent
:
Seluruh no node ya yang te terletak se sebelum no node te tertentu da dan terletak pada jalur yang sama
•
Parent
:
Predecessor satu level diatas suatu node.
•
Child
:
Successor satu level dibawah suatu node.
•
Sibling
:
Node-node yang memiliki parent yang sama dengan suatu node
•
Subtree
:
Bagian dari tree yang berupa suatu node beserta descendantnya, dan memiliki semua karakteristik dari tree tersebut.
•
Size
:
Banyaknya node dalam suati tree.
•
Height
:
Banyaknya tingkatan / level dalam suatu tree.
•
Root
:
Satu-satunya node khusus dalam tree yang tidak mempunyai predecessor
•
L ea f
:
Node –node dalam tree yang tidak memiliki successor.
18
•
3.2
Degree
:
Banyaknya child yang dimiliki suatu node.
Representasi Dari Tree Ada beberapa cara untuk menggambarkan sebuah tree yaitu : •
Pedigree chart
•
Lineal chart
•
Diagram venn atau nested sets
•
Nested parentheses
19
( N N 0 ( N N 1 ( N N 2) 2) ( N N 3) 3) ( N N 4)) 4)) ( N 5) 5) ( N N 6 ( N N 7) 7) ( N N 8))) 8)))
•
Bar chart
•
Level-number notation
3.3Jenis- Jenis Tree
•
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 nodenode 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). Contoh dari non-ordered tree :
Contoh dari ordered tree :
Binary Tree dapat digambarkan berdasarkan kondisinya, sebagai berikut:
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 dari sebuah sebuah simpul simpul adalah adalah semua semua simpul simpul yang yang berada berada diatas diatas antara antara simpul simpul terseb tersebut ut dengan dengan root. root. Penamp Penampil ilan an dari dari sebuah sebuah tree tree akan ditamp ditampilk ilkan an dengan dengan berat berat dari dari tree 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 dikena dikenall istil istilah ah deraja derajad d (degre (degree) e) dari dari suatu suatu simpul simpul.. Deraja Derajad d suatu suatu simpul simpul dinyat dinyataka akan n sebagai banyaknya anak atau turunan dari simpul tersebut.
Jenis- jenis binary tree : -
Full Binary Tree
22
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree harus mempunyai panjang path yang sama.
-
Complete Bi Binar nary Tr Tree 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 wed Binary ary Tree Skewed binary tree adalah binary tree yang semua nodenya (kecuali leaf) hanya memiliki satu child.
3.4 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.
•
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)
•
Deletesub
:
Menghapus sebuah subtree
•
Char Charac acte teri rist stic ic
:
Meng Menget etah ahui ui kara karakt kter eris isti tik k dar darii sua suatu tu tree tree,, yak yakni ni size size,, hei heigh ght, t, serta average length. Tree tidak boleh kosong.
•
Tranverse
:
Mengunjungi seluruh node- node pada tree, masing-masing Sekali. Hasilnya adalah urutan informasi secara linear yang
23
Tersimpan dalam tree. Ada tiga cara tranverse, yaitu preorder, inorder, dan postorder
3.5 Binary Search Tree Binary tree ini memiliki sifat dimana semua left child harus lebih kecil daripada right child dan parentnya. Semua right child juga harus lebih besar dari pada pada left left chil child d sert serta a pare parent ntny nya. a. Bina Binary ry sear search ch tree tree dibu dibuat at untu untuk k meng mengat atas asii kelemahan kelemahan pada binary binary tree biasa, yaitu yaitu kesulitan kesulitan dalam searchin searching g / pencaria pencarian n node tertentu dalam binary tree. binary search tree atau BST Dalam ilmu komputer, sebuah pohon biner terurut ( binary ) 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.
PEMBENTUKAN BINARY SEARCH TREE (BST)
Bila diketahui sederetan data 5, 3, 7, 1, 4, 6, 8, 9 maka proses inserting (memasukkan) data tersebut dalam algoritma BST per langkah adalah sebagai berikut :
Langkah 1: Pemasukan data 5 sebagai root
Langkah 2: Pemasukan data 3 disebelah kiri simpul 5 karena 3 < 5.
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 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 5: Pemasukan data 4.
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 besar dari data 7, penelusu penelusuran ran terus dilanjutkan dilanjutkan kesebelah kesebelah kanan. kanan. Selanjut Selanjutnya nya ditemukan ditemukan daun dengan nilai 8, karena data 9 lebih besar dari 8 maka data 9 disisipkan disebelah kanan simpul 8.
Operasi-Operasi Standar pada binary search tree (BST) : • •
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 berpenga berpengaruh ruh pada posisi posisi node tersebut tersebut selanjut selanjutnya. nya. Bila update update mengakib mengakibatkan atkan 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 Jika yang yang didel didelete ete adalah adalah node node yang yang hanya hanya memil memiliki iki satu satu anak, anak, maka maka anak anak tersebut langsung menggantikan posisi dari parent-nya. parent-nya. - Jika yang didelete adalah node dengan 2 anak (2 subtree), maka node yang diambil mengganti node yang dihapus adalah: a. Berasal dari left subtree yang diambil adalah node yang paling
27
kanan (nilai terbesar) b. Berasal dari right subtree yang diambil adalah node yang paling kiri (nilai terkecil)
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 menyei menyeimba mbangk ngkan an binary binary searc search h tree. tree. Dengan Dengan AVL Tree, Tree, waktu waktu pencar pencarian ian 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 Untuk memuda memudahka hkan n dalam dalam menye menyeim imban bangka gkan n tree, tree, diguna digunakan kan symbo symbol-s l-sim imbo boll bantu : •
- (tanda (tanda minu minus) s)
: digunak digunakan an apabi apabila la subtr subtree ee kiri kiri lebi lebih h panjang panjang dari dari subt subtree ree Kanan.
•
+(ta +(tanda nda plus plus))
: digu digunak nakan an apabi apabila la sub subtr tree ee kanan kanan lebi lebih h panj panjan ang g dari dari subt subtre reee Kiri.
•
0 (nol)
: digunakan apabila subtree kiri dan subtree kanan mempunyai height yang sama.
3.6 DEKLARASI TREE
PENYAJIAN DENGAN ARRAY
Pohon biner dapat disajikan secara berurutan dengan menggunakan array atau atau file. file. Untuk Untuk itu diperl diperluka ukan n adanya adanya satu satu aturan aturan terten tertentu tu dengat dengat mengi menging ngat at defini definisi si pohon pohon biner. biner.poh pohon on yang yang merup merupaka akan n kedala kedalaman man N memp mempuny unyai ai simpul simpul (N-1) maksi maksimum mum 2 , deng dengan an N adal adalah ah ke keda dala lama man n simp simpul ul.. Seba Sebaga gaii cont contoh oh poho pohon n dengan kedalaman 4, mempunyai simpul secara keseluruhan (dari tingkat 1 sampai dengan 4) adalah 15 buah.
28
Dengan Dengan demikian, demikian, penyajian penyajian pohon pohon biner biner secara secara beruruta berurutan n dalam dalam sebuah sebuah array array adalah adalah sebagai sebagai berikut. berikut. Akar pohon (simpul (simpul tingkat tingkat pertama) pertama) selalu selalu menempat menempatii elemen pertama array, simpul-simpul simpul-simpul tingkat 2 diletakkan sebagai elemen ke-2 dan 3. SimpulSimpul-simp simpul ul pada tingkat 3 diletakka diletakkan n sebagai sebagai elemen elemen ke-4,5,6, ke-4,5,6,7. 7. SimpulSimpulsimpul 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 :
PENYAJIAN DENGAN LINKED LIST
Simpul dalam pohon biner dapat disajikan dengan list sebagai berikut :
29
BAB IV HASIL DAN PEMBAHASAN
4.1
Deklarasi Tree
Karena tree tersusun oleh node-node, maka yang perlu kita deklarasikan adalah Node. komponen node itu sendiri. Dalam contoh dibawah, akan kita namai Node Sebelumnya perlu kita lihat bahwa untuk mewujudkan implementasi node ke dalam bahasa pemrograman, diperlukan sebuah struktur yang memiliki susunan berikut ini:
typedef struct Node{ int data; Node *kiri; Node *kanan; };
Vari Variab abel el data data digu diguna naka kan n untu untuk k meny menyim impa pan n nila nilaii ang angka node node ters terseb ebut ut,, sedangkan kiri dan kanan, bertipe pointer, masing-masing mewakili vektor yang akan menunjuk ke node anak kiri dan kanan.
30
4.2
Inisialisasi Tr 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 Main: 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.
4.3 4.3
Menam enamba bahk hka an No Node Pada Pada Tree Tree
Karena Karena pohon pohon yang yang kita kita buat buat merup merupaka akan n sebuah sebuah pohon pohon biner biner,, maka maka untuk untuk menambahkan sebuah node, secara otomatis penambahan tersebut mengikuti aturan penambahan node pada pohon biner: 1. Jika pohon pohon kosong, kosong, maka node node baru baru ditempatka ditempatkan n sebagai sebagai akar pohon. pohon. 2. Jika Jika poho pohon n tida tidak k ko koso song ng,, maka maka dimu dimula laii dari dari node node ak akar ar,, dila dilaku kuka kan n pros proses es pengecekan berikut: a. Jika nilai nilai node baru lebih kecil dari nilai nilai node yang sedang dicek, 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 kiri terseb tersebut. ut. Pengec Pengeceka ekan n ini dilaku dilakukan kan seteru seterusny snya a hingga hingga node node baru baru dapat ditempatkan. b. Jika nilai node baru lebih besar besar dari nilai node yang sedang dicek, 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 terhad terhadap ap node node kanan kanan terseb tersebut. ut. Pengec Pengeceka ekan n ini dilak dilakuka ukan n seteru seterusny snya a hingga node baru dapat ditempatkan. Proses penambahan ini diimplementasikan secara rekursif pada fungsi berikut: 31
if((*root) == NULL){ Node *baru; baru = new Node; baru->data = databaru; baru->kiri = NULL; baru->kanan = NULL; (*root) = baru; (*root)->kiri = NULL; (*root)->kanan = NULL; } else if(databaru < (*root)->data) tambah(&(*root)->kiri,databaru); else if(databaru > (*root)->data) tambah(&(*root)->kanan,databaru);
Variabel **root mana yang sedang dicek saat ini, untuk itu else menunjukkan if(databaru ==node (*root)->data) saat saat pemang pemanggil gilan an fungs fungsii ini, ini, varia variabel bel **root kita kita beri beri nila nilaii poin pointe terr yang yang printf("Data sudah ada!"); menunjuk ke node akar, yaitu pohon . } tambah(&pohon,data);
Untuk selengkapnya dapat dilihat pada bagian 5, kode program lengkap. 4.4 4.4
Memb Membac aca a dan dan Mena Menamp mpil ilka kan n Nod Node e Pad Pada a Tree Tree
Untuk Untuk membaca membaca dan menampil menampilkan kan seluruh node yang terdapat 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 diimplementasikan dengan fungsi rekursif. a. Kunjun Kunjungan gan Pre-Or Pre-Order der.. Kunjungan pre-order pre-order dilakukan mulai dari akar pohon, dengan urutan:
1. Cetak isi (data) node yang sedang dikunjungi 2. Kunjungi kiri node tersebut,
32
- Jika Jika kiri kiri bukan bukan kosong kosong (tidak (tidak NULL) mulai mulai lagi lagi dari dari langka langkah h pertam pertama, a, terapkan untuk kiri tersebut. - Jika Jika kiri kiri kosong kosong NULL ( ), lanjut ke langkah ketiga. 3. Kunjungi kanan node tersebut, - Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. - Jika Jika ka kan nan ko kos song ong NULL ( ), proses proses untuk untuk node node ini ini selesa selesai, i, tuntas tuntaskan kan 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. Kunjun Kunjungan gan In-Ord In-Order. er. 1. Kunjungi kiri node tersebut,
- Jika Jika kiri kiri bukan bukan kosong kosong (tidak (tidak NULL) mulai mulai lagi lagi dari dari langka langkah h pertam pertama, a, terapkan untuk kiri tersebut. - Jika Jika kiri kiri kosong kosong NULL ( ), lanjut ke langkah kedua. 2. Cetak isi (data) node yang sedang dikunjungi 3. Kunjungi kanan node tersebut, - Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. - Jika Jika ka kan nan ko kos song ong NULL ( ), proses proses untuk untuk node node ini ini selesa selesai, i, tuntas tuntaskan kan 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. Kunjun Kunjungan gan Post-O Post-Orde rder. r. 1. Kunjungi kiri node tersebut,
- Jika Jika kiri kiri bukan bukan kosong kosong (tidak (tidak NULL) mulai mulai lagi lagi dari dari langka langkah h pertam pertama, a, terapkan untuk kiri tersebut. - Jika Jika kiri kiri kosong kosong NULL ( ), lanjut ke langkah kedua. 2. Kunjungi kanan node tersebut, - Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. - Jika Jika kanan kanan kosong kosong NULL ( ), lanjut ke langkah ketiga. 3. Ceta Cetak k isi isi (data) node node yang yang sedang sedang dikunj dikunjun ungi. gi. Proses Proses untuk untuk node node ini sele selesa sai, i, tunt tuntas aska kan n pros proses es yang yang sama sama untu untuk k node node yang yang diku dikunj njun ungi gi 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 Tree meru merupa paka kan n sala salah h satu satu bent bentuk uk stru strukt ktur ur data data tida tidak k line linear ar yang yang mengg menggam ambar barka kan n 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. Untu Untuk k memb memban angun gun logi logika ka berp berpik ikir ir dan meng mengim impl plem ement entas asik ikan an seti setiap ap perm permas asal alaha ahan n meng mengen enai ai algo algori ritm tmaa tree tree dapat dapat dise disele lesa saik ikan an seca secara ra logi logiss dalam dalam bent bentuk uk bahas bahasaa pemrograman C++.
5.2 Saran- Saran Dari hasil penulisan laporan dan pembelajaran mata kuliah Struktur Data. Selama masa perkuliahan disarankan : 1. Diharapkan Diharapkan dimasa dimasa yang akan akan datang pemberia pemberian n penjelasan penjelasan materi materi dapat diberikan diberikan secara secara jelas sehingga memudahkan dalam melakukan pratikum. 2. Dengan dilakukann dilakukannya ya pratikum pratikum Struktur Struktur data, data, diharapkan diharapkan mahasiswa mahasiswa/i /i dapat menambah menambah pen penge geta tahu huan anny nyaa tent tentan ang g prat pratik ikum um stru strukt ktur ur data data deng dengan an meng menggu guna naka kan n baha bahasa sa pemograman C++. Selain itu mahasiswa seharusnya juga dapat mengimplementasikan kemahiranny kemahirannyaa menggunakan menggunakan bahasa pemrograman pemrograman C++ untuk memecahkan masalah masalah algoritmis dalam kehidupan sehari-hari.
35
DAFTAR PUSTAKA http://id.wikipedia.org/wiki/Struktur_data http://dharmaatmaja.Wordpress.com/tag/tree/
36
LAMPIRAN PROGRAM Beriku Berikutt ini ini kode kode progra program m keselu keseluruh ruhan, an, terma termasuk suk menu menu tampil tampilan, an, di mana mana di dalam dalamny nya a terdap terdapat at Deklar Deklaras asii Tree, Tree, Inisia Inisialis lisasi asi Tree, Tree, Penam Penambah bahan an Node, Node, dan Pembacaaan serta Menampilkan Node dengan 3 macam kunjungan. Kode ditulis dengan C++
#include #include
typedef struct Node{ int data; Node *kiri; Node *kanan; }; void tambah(Node **root,int databaru){ if((*root) == NULL){ Node *baru; baru = new Node; baru->data = databaru; baru->kiri = NULL; baru->kanan = NULL; (*root) = baru;
37
(*root)->kiri = NULL; (*root)->kanan = NULL; printf("Data bertambah!"); } else if(databaru < (*root)->data) tambah(&(*root)->kiri,databaru); else if(databaru > (*root)->data) tambah(&(*root)->kanan,databaru); else if(databaru == (*root)->data) printf("Data sudah ada!"); } void preOrder(Node *root){ if(root != NULL){ printf("%d ",root->data); preOrder(root->kiri); preOrder(root->kanan); } } void inOrder(Node *root){ if(root != NULL){ inOrder(root->kiri); printf("%d ",root->data); inOrder(root->kanan); } } void postOrder(Node *root){ 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("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!");
39
break; case 4:
if(pohon!=NULL) postOrder(pohon);
else printf("Masih kosong!"); break;
}
getch(); }while(pil!=5); }
40