Penelusuran Bab 7 Pohon Biner 219.

Slides:



Advertisements
Presentasi serupa
STRUKTUR DATA (10) tree manipulation
Advertisements

Binary Tree Traversal.
STACK (Tumpukan) Tumpukan Koin Tumpukan Kotak.
Linked List BEBERAPA CONTOH SOAL 6.3 & 7.3 NESTED LOOP.
STRUKTUR DATA TREE (POHON)
7 POHON BINER BAB Definisi Pohon dan Pohon Biner
Linked List Pembuatan Simpul Awal.
By : Fitroh Amaluddin & Galih Wasis W.
BAB 6 Binary Tree (Pohon Biner).
Pertermuan 10 PADA POHON BINER KUNJUNGAN IMAM SIBRO MALISI
3 Variabel, Konstanta Tipe Data dan dalam Bahasa C/C++ Java dan Bab
Tree.
Pertemuan Struktur Data *Pohon Ekspresi *
Kuliah ke-9 Struktur Data Pohon/Tree (Bab 6)
STACK (TUMPUKAN).
Tree Yuliana S.
Binary Tree Rangga Juniansyah.
Operasi pada pohon biner
Single Linked List Yuliana Setiowati, S.Kom.
LINKED LIST by Yohana N.
Algorithm and Data Structures.
Pertemuan ketujuh Struktur data st3telkom.ac.id
Tenia Wahyuningrum, S.Kom. MT
POINTER.
STRUKTUR DATA tree manipulation
BINARY TREE Universitas Ahmad Dahlan
Algoritma dan Struktur Data
Tree. Tree (Pohon) Dalam dunia nyata, sebuah pohon memiliki : akar, cabang, daun. Dalam dunia komputer, pohon (tree) memiliki 3 (tiga) bagian tersebut.
Pertemuan 7 stack jual [Valdo] Lunatik Chubby Stylus.
Bocoran Soal 6.3 & 7.3 NESTED LOOP UTS.
Universitas Budi Luhur
Binary Tree.
Pohon Seimbang / AVL Tree (Bab 6)
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
Menggambar Tree wijanarto.
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
TREE STRUCTURE (Struktur Pohon)
Sapta Candra Miarsa,S.T.,M.T.
Binary Tree Rangga Juniansyah.
BAB 5 TREE (Pohon) 179.
STACK 6.3 & 7.3 NESTED LOOP.
Manipulasi Tree.
SEMANTIKS Pertemuan Ke-3.
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
STRUKTUR DATA Tree (Struktur Pohon).
Kunjungan Pada Pohon Biner
STRUKTUR DATA 2014 M. Bayu Wibisono.
Linked List INSERT KIRI 6.3 & 7.3 NESTED LOOP.
Manipulasi Tree.
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
Linked List 6.3 & 7.3 NESTED LOOP.
Stack.
Parts of a Tree.
Penelusuran Binary Tree
Tim Struktur Data Program Studi Teknik Informatika UNIKOM
Tree (Pohon).
POHON Pohon (Tree) merupakan graph terhubung tidak berarah dan tidak mengandung circuit. Contoh: (Bukan) (Bukan) (Bukan)
Oleh Shoffin Nahwa Utama, S.Kom
BINARY SEARCH TREE (BST)
IT234 Algoritma dan Struktur Data
Linear Doubly INSERT KIRI
Linear Doubly INSERT TENGAH
IT234 Algoritma dan Struktur Data
Linear Doubly Linked List
Pohon Biner.
Algoritma dan Struktur Data
IT234 Algoritma dan Struktur Data
TREE Oleh : Neny silvia Nurhidayah Afny wilujeng Setyorini
Review Struktur Data Nisa’ul Hafidhoh, MT.
Transcript presentasi:

Penelusuran Bab 7 Pohon Biner 219

Penelusuran (traverse atau traversal ) pohon biner, maksudnya membaca atau mengunjungi (visit) simpul-simpul pohon biner dengan urutan tertentu. Ada 3 (tiga) macam penelusuran, yang bila ditambah dengan kebalikannya menjadi 6 (enam) macam penelusuran sebagai berikut : 1. Preorder (atau depth-first order) 2. Inorder (atau symetric order) 3. Postorder 4. Inverse Preorder 5. Inverse Inorder 6. Inverse Postorder

B A + Pohon pada Gambar-7.1 maka hasil Bila ditelusuri penelusurannya: secara maka hasil penelusurannya: Preorder + A B (bentuk PREFIX) Inorder A + B (bentuk INFIX) Postorder A B + (bentuk POSTFIX) Gambar-7.1

Pohon pada Gambar-7.1 diatas, sebenarnya adalah hasil representasi arithmetic statement : A + B ke dalam pohon biner (hal ini akan dibahas pada bab tersendiri). Dalam arithmetic statement A + B, A dan B disebut operand dan tanda tambah (+) disebut operator. Bentuk A + B ini biasa disebut bentuk INFIX, yang artinya operatornya berada didalam (IN) atau antara dua buah operand. Selain bentuk INFIX, komputer mengenal bentuk PREFIX seperti + A B, dimana operatornya berada sebelum (PRE) dua buah operand, dan bentuk POSTFIX seperti A B + dimana operatornya berada sesudah (POST) dua buah operand. Tapi sebuah pohon biner belum tentu merupakan representasi arithmetic statement, seperti yang diilustrasikan paga Gambar-7.2

C B A Pohon pada Gambar-7.2 maka hasil Bila ditelusuri penelusurannya: secara maka hasil penelusurannya: Preorder A B C Inorder B A C Postorder B C A Gambar-7.2 219

7 Penelusuran Pohon Biner Bab Penelusuran (traverse atau traversal ) pohon biner, maksudnya membaca atau mengunjungi (visit) simpul-simpul pohon biner dengan urutan tertentu. Ada 3 (tiga) macam penelusuran, yang bila ditambah dengan kebalikannya menjadi 6 (enam) macam penelusuran sebagai berikut : 1. Preorder (atau depth-first order) 4. Inverse Preorder 2. Inorder (atau symetric order) 5. Inverse Inorder 3. Postorder 6. Inverse Postorder Untuk memahami istilah Pre, Post, In, order diatas, pandanglah sebuah pohon atau subpohon sebagai berikut : B A + Gambar-7.1 Pohon pada Gambar7.1 Bila ditelusuri secara maka hasil penelusurannya: Preorder + A B (bentuk PREFIX) Inorder A + B (bentuk INFIX) Postorder A B + (bentuk POSTFIX) Pohon pada Gambar-7.1 diatas, sebenarnya adalah hasil representasi arithmetic statement : A + B ke dalam pohon biner (hal ini akan dibahas pada bab tersendiri). Dalam arithmetic statement A + B, A dan B disebut operand dan tanda tambah (+) disebut operator. Bentuk A + B ini biasa disebut bentuk INFIX, yang artinya operatornya berada didalam (IN) atau antara dua buah operand. Selain bentuk INFIX, komputer mengenal bentuk PREFIX seperti + A B, dimana operatornya berada sebelum (PRE) dua buah operand, dan bentuk POSTFIX seperti A B + dimana operatornya berada sesudah (POST) dua buah operand. Tapi sebuah pohon biner belum tentu merupakan representasi arithmetic statement, seperti yang diilustrasikan paga Gambar-7.2 C B A Gambar-7.2 Pohon pada Gambar-7.2 Bila ditelusuri secara maka hasil penelusurannya: Preorder A B C Inorder B A C Postorder B C A Karena bukan merupakan arithmetic statement, jadi tidak diistilahkan dengan bentuk INFIX, PREFIX dan POSTFIX 219

Dari dua ilustrasi diatas, dapat dilihat sebagai berikut: Untuk penelusuran Preorder, urutannya adalah : Ambil Akar, kemudian telusuri secara preorder subpohon kiri. Dalam menelusuri subpohon kiri, kembali berulang ambil akar dan telusuri subpohon kiri dan seterusnya sampai selesai tidak bisa ditelusuri kekiri lagi yaitu apabila ditemui pointer Left == NULL. Setelah selesai penelusuran ke subpohon kiri, kemudian dilanjutkan dengan penelusuran secara preorder ke subpohon kanan. Dalam penelusuran subpohon kanan diulangi lagi penelusuran kekiri dan seterusnya. Jadi penelusurannya sendiri dapat dibuat bersifat recursive. Dalam buku literatur, untuk penelusursn preorder ditulis : 1. Visit the root. 2. Traverse the left subtree in preorder. 3. Traverse the right subtree in preorder Untuk penelusuran inorder : Untuk penelusuran postorder 1. Traverse the left subtree in preorder. 1. Traverse the left subtree in postorder 2. Visit the root. 2. Traverse the right subtree in postorder 3. Traverse the right subtree in preorder 3. Visit the root. Agar mudah diingat, prosesnya ketiganya dapat disingkat sebagai berikut : Untuk Preorder, ---> AKAR, KIRI, KANAN Untuk Inorder, ----> KIRI, AKAR, KANAN Untuk Postorder, --> KIRI, KANAN, AKAR 7.1 Beberapa contoh pohon biner dan hasil penelusurannya : C F B E A D B A C B A A Gambar-7.3 a Gambar-7.3 b Gambar-7.3c Gambar-7.3d Preorder : A Inorder : A Postorder: A Preorder : A B Inorder : B A Postorder: B A Preorder : A B C Inorder : B A C Postorder: B C A Pre : A B D E C F In : D B E A F C Post: D E B F C A E J K D F M B C G A H V W Gambar-7.3 f E J K D F M B C G A H Gambar-7.3 e Pre : A B D H E J K C F M G In : H D B J E K A F M C G Post: H D J K E B M F G C A Pre : A B D H E J K V W C F M G In : H D B J E V K W A F M C G Post: H D J V W K E B M F G C A 220

Untuk Preorder : Akar, Kiri, Kanan : E J K V W B D H C F M G Pre : A B D H E J K V W C F M G In : H D B J E V K W A F M C G Post: H D J V W K E B M F G C A Gambar-7.3 f Lihat Gambar-7.3 f Untuk Preorder : Akar, Kiri, Kanan : E J K V W B D H Akar Kiri Kanan C F M G Akar Kiri Kanan Akar Kiri Kanan A Akar Kiri Kanan Sehingga didapat hasil penelusuran preorder : A B D H E J K V W C F M G Lihat Gambar-7.3f Untuk Inorder : Kiri, Akar, Kanan : A Akar Kiri Kanan B H D E J V K W C F M G Sehingga didapat hasil penelusuran inorder : H D B J E V K W A F M C G Lihat Gambar-7.3 f Untuk Postorder : Kiri, Kanan, Akar : A Akar Kiri Kanan B H D E J V W K C M F G Sehingga didapat hasil penelusuran postorder : H D J V W K E B M F G C A 221

Hasil penelusuran untuk pohon Gambar-7.4 Z L X Y N F G O C I R S H Q J T U D E K V W B A P Gambar-7.4 Hasil penelusuran untuk pohon Gambar-7.4 Preorder : A B D HPQ IRS E JTU KVW C F LXY MZ GNO Inorder : PHQ D RIS B TJU E VKW A XLY F ZM C NGO Postorder: PQH RSI D TUJ VWK E B XYL ZM F NOG C A 7.2 Program (Fungsi) Penelusuran Pohon Biner Root C B A Y X + Preorder : A B C Inorder : B A C Postorder: B C A Preorder : + X Y Inorder : X + Y Postorder: X Y + Hanya ada 3 (tiga) macam penelusuran yang akan dibahas, yaitu Preorder, Inorder, dan Postorder. Algoritma penelusuran ditulis dalam sebuah fungsi. Fungsi dapat bersifat recursive atau non recursive. recursive 1) Fungsi yang bersifat recursive a. b. c. Fungsi Penelusuran Preorder. Ingat : Akar, Kiri, Kanan Fungsi Penelusuran Inorder. Ingat : Kiri, Akar, Kanan Fungsi Penelusuran Postorder. Ingat : Kiri, Kanan, Akar. void PreOrder (Simpul *T) { if( T != NULL) { printf("%c ", T->INFO); PreOrder(T->Left); PreOrder(T->Right); } void InOrder (Simpul *T) { if T != NULL) { InOrder(T->Left); printf("%c ", T->INFO); InOrder(T->Right); } void PostOrder (Simpul *T) { if (T != NULL) { PostOrder(T->Left); PostOrder(T->Right); printf("%c ", T->INFO); } Fungsi ini akan dipanggil dari program induk atau fungsi main( ) dengan instruksi : PreOrder(Root); Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : InOrder(Root); Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : PostOrder(Root); 222

2) Fungsi yang bersifat non recursive Proses disini menggunakan Stack, untuk menyimpan alamat simpul-simpul yang telah dikunjungi. Alamat ini penting untuk disimpan agar dapat kembali menuju akar atau simpul yang ada di ‘atas’ nya. Besarnya Stack tergantung kebutuhan yang lebih dikaitkan dengan ketinggian atau kedalaman pohon. Karena digunakan untuk menyimpan alamat, maka tipe Stack adalah tipe pointer (menggunakan bintang (*) ) yakni pointer yang menunjuk suatu Simpul. a. Fungsi untuk Penelusuran Preorder non recursive. Pointer T berisi alamat simpul akar. Simpul akar ditunjuk oleh Pointer Root. void PreOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *Q; top = -1; Q = T; do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL)); Fungsi ini akan dipanggil dari program induk atau fungsi main( ) dengan instruksi : PreOrderNonRec(Root); Perhatikan instruksi : Simpul *S[20] Instruksi ini menyiapkan array satu dimensi bernama S sebanyak 20 elemen bertipe pointer (pakai *) dimana pointer tersebut dapat mencatat alamat obyek berstruktur Simpul. non recursive b. Fungsi Penelusuran Inorder non recursive. void InOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *Q; top = -1; Q = T; do { while(Q != NULL) { top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; X = Q->INFO; printf(“%c “, X); Q = Q->Right; while((top > -1) || (Q != NULL)); Fungsi ini akan dipanggil dari program induk atau fungsi main( ) dengan instruksi : InOrderNonRec(Root); Root &A = alamat simpul yang INFOnya = ‘A’ A B 3 2 1 -1 D &H &D &B Q &A H *s Pertama kali ini diisi dengan alamat simpul akar 223

Fungsi untuk Penelusuran Preorder non recursive. Uraian proses langkah per langkah T void PreOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *Q; top = -1; Q = T; do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL)); Q A B C D E F J M Bila dicetak hasil penelusuran secara PREORDER, akan tercetak : A B D E J C F M Top = 0 Top = 1 Top = 2 AWAL : Top = -1 S[0] = Q; Q = Q->Left; S[1] = Q; Q = Q->Left; S[2] = Q; Q = Q->Left; Q = T; Sekarang Q jadi NULL Q != NULL true Karena Q==NULL, maka keluar dari inner loop, dan sudah tercetak: A B D. Perhatikan : Top menunjuk S[2] yang berisi alamat simpul D 5 4 3 2 1 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; 5 4 3 2 1 -1 5 4 3 2 1 -1 5 4 3 2 1 -1 &D &B &B &A &A &A Top = -1 Q = &A Q = &B Q = &D Q = NULL Tercetak : A Tercetak : A B Tercetak : A B D if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; Q = Q->Right; while((top > -1) || (Q != NULL)); Q menunjuk simpul D Top--; Q menjadi NULL T E J D F M B C A ternyata E J D F M B C A Q 5 4 3 2 1 -1 5 4 3 2 1 -1 Top > -1 &D Keluar dari loop do-while pertama Masuk ke loop ke-2 &B &B Q &A &A Sampai disini sudah tercetak : A B D 224

225 Keadaan sesudah loop do-while pertama Masuk loop ke-2 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if E J D F M B C A T Q 5 4 3 2 1 -1 Top > -1 true, &B &A Q menunjuk B Top menjadi A Top = 1 Q == NULL Q = Q->Right; Cetak : ‘E’ Cetak : ‘J’ Q menunjuk E Tercetak : A B D E Tercetak : A B D E J Top = 1 Top = 2 Top = 0 S[1] = &E Q = Q->Left; S[2] = &J; Q = Q->Left; Karena Q==NULL, maka keluar dari loop, dan sudah tercetak: A B D E J Perhatikan : Top menunjuk S[2] yang berisi alamat simpul J Q = &E 5 4 3 2 1 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; 5 4 3 2 1 -1 5 4 3 2 1 -1 &J E J D F M B C A T Q &E &E &A &A &A Q = &J Q = NULL Lanjutkan kesini if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = Q->Right; Q = S[top]; while((top > -1) || (Q != NULL)); Q menunjuk simpul J Q menjadi NULL Top--; T A 5 4 3 2 1 -1 5 4 3 2 1 -1 ternyata B C Top > -1 A &J D E F B C &E &E Keluar dari loop do-while ke-2 Masuk ke loop ke-2 &A &A J Q M D Q E F Sampai disini sudah tercetak : A B D E J J M 225

do while((top > -1) || do while((top > -1) || 226 Keadaan sesudah loop do-while ke-2 Dan masuk ke loop ke-3 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if T A 5 4 3 2 1 -1 B C Top > -1 true, D E F &E Q = S[Top]; &A J Q M Q menunjuk E Top--; Top menjadi A Q == NULL Q = Q->Right; Q menunjuk NULL Top = 0 while((top > -1) || (Q != NULL)); Q == NULL E J D F M B C A T Q 5 4 3 2 1 -1 Pada Loop ke-3, tidak mencetak sesuatu, hanya proses kembali ke simpul sebelumnya ternyata Top > -1 &A Keluar dari loop ke-3 Masuk ke loop ke-4 Q == NULL Sampai disini sudah tercetak : A B D E J Keadaan sesudah loop do-while ke-3 Dan masuk ke loop ke-4 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if E J D F M B C A T Q Top = 0 Q == NULL Top > -1 true, 5 4 3 2 1 -1 Q = S[Top]; Q menunjuk &A Top--; Top menjadi -1 &A Q = Q->Right; Q == NULL Q != NULL Keluar dari loop ke-4 Masuk ke loop ke-5 Q menunjuk &C 226

do while((top > -1) || 227 Keadaan sesudah loop do-while ke-4 Dan masuk ke loop ke-5 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q != NULL, Kerjakan inner loop. Sampai disini sudah tercetak : A B D E J T A Q 5 4 3 2 1 -1 B C D E F J M Top == -1 Q == &C Cetak : ‘C’ Cetak : ‘F’ Q menunjuk E Tercetak : A B D E J C Tercetak : A B D E J C F Top = 0 Top = 1 Top = -1 S[0] = &C Q = Q->Left; S[1] = &F; Q = Q->Left; Karena Q==NULL, maka keluar dari loop, dan sudah tercetak: A B D E J C F Perhatikan : Top menunjuk S[1] yang berisi alamat simpul F Q = &C 5 4 3 2 1 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; 5 4 3 2 1 -1 5 4 3 2 1 -1 T &F &C &C A Q = &F Q = NULL B C Q D E F Lanjutkan kesini J M Top > -1 true if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; Q = Q->Right; while((top > -1) || (Q != NULL)); Q menunjuk simpul F Top--; Q meunjuk M T A ternyata 5 4 3 2 1 -1 5 4 3 2 1 -1 Top > -1 B C D E F Q Keluar dari loop do-while ke-5 Masuk ke loop ke-6 &F &C &C J M Sampai disini sudah tercetak : A B D E J C F 227

do while((top > -1) || 228 Keadaan sesudah loop do-while ke-5 Dan masuk ke loop ke-6 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q != NULL, Kerjakan inner loop. Sampai disini sudah tercetak : A B D E J C F Top = 0 Q == &M T A 5 4 3 2 1 -1 B C D E F Q &C J M Cetak : ‘M’ Tercetak : A B D E J C F M Q menunjuk E Top++; Top = 1 Top = 0 S[1] = &M Q = Q->Left; Karena Q==NULL, maka keluar dari loop, dan sudah tercetak: A B D E J C F M Perhatikan : Top menunjuk S[1] yang berisi alamat simpul M Q == &M 5 4 3 2 1 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; 5 4 3 2 1 -1 T A &M B C &C &C D E F Q == NULL J Q M Lanjutkan kesini Top > -1 true if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; Q = Q->Right; while((top > -1) || (Q != NULL)); Q menunjuk simpul M Top--; Q meunjuk NULL T A ternyata 5 4 3 2 1 -1 5 4 3 2 1 -1 Top > -1 B C D E F Keluar dari loop do-while ke-6 Masuk ke loop ke-7 &M &C &C J M Q Sampai disini sudah tercetak : A B D E J C F M 228

do while((top > -1) || 229 Keadaan sesudah loop do-while ke-6 Dan masuk ke loop ke-7 do { while(Q != NULL) { X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while((top > -1) || (Q != NULL) ); Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if Sampai disini sudah tercetak : A B D E J C F M Top = 0 Q == NULL T A Top > -1 true, 5 4 3 2 1 -1 B C Q = S[Top]; D E F Q menunjuk C Top--; &C J M Q Top menunjuk -1 Q = Q->Right; if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; Q = Q->Right; Q menunjuk NULL Q menunjuk NULL Q menjadi NULL Q menunjuk simpul C Top--; E J D F M B C A T Q T 5 4 3 2 1 -1 5 4 3 2 1 -1 Q A B C &C D E F J M while((top > -1) || (Q != NULL)); Top = -1 T Q == NULL ternyata ternyata A Top == -1 Q == NULL 5 4 3 2 1 -1 B C Q False False D E F Nilai Kondisi == FALSE J M Keluar dari do .. while loop Q == NULL Proses Selesai Telah tercetak : A B D E J C F M 229

7.3. Contoh Program. M A C B E L G F Akar Gambar-7.5 1. Membuat pohon biner seperti Gambar-7.5.Kemudian mencetak simpul satu persatu dengan urutan penelusuran secara : preorder, inorder, dan postorder. //trilvl3.cpp #include<stdio.h> #include<malloc.h> #include<conio.h> struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Akar, *P; char X; void Inisialisasi() { Akar = NULL; P = NULL; } void BuatSimpul(char X) { P = (Simpul*) malloc(sizeof(Simpul)); P->INFO = X; P->Left = NULL; P->Right = NULL; void BuatAkar() { Akar = P; void PreOrder(Simpul *T) { if(T != NULL) { printf("%c ", T->INFO); PreOrder(T->Left); PreOrder(T->Right); } void InOrder(Simpul *T) { InOrder(T->Left); printf("%c ", T->INFO); InOrder(T->Right); } void PostOrder(Simpul *T) { PostOrder(T->Left); PostOrder(T->Right); Ketik program ini dan RUN Akan tercetak : Preorder : A B E C F L M G Inorder : B E A L F M C G Postorder : E B L M F G C A Instruksi-instruksi membuat atau menginsert simpul-simpul pohon secara ‘manual’ Cara seperti ini tidak berlaku umum. Digunakan disini hanya untuk memudahkan membuat pohon seperti pada gambar diatas. Lihat cara lain halaman berikutnya void main() { Inisialisasi(); BuatSimpul('A'); BuatAkar(); BuatSimpul('B'); Akar->Left = P; BuatSimpul('C'); Akar->Right = P; BuatSimpul('G'); Akar->Right->Right = P; BuatSimpul('E'); Akar->Left->Right = P; BuatSimpul('F'); Akar->Right->Left = P; BuatSimpul('L'); Akar->Right->Left->Left = P; BuatSimpul('M'); Akar->Right->Left->Right = P; printf(“\n Preorder : “); PreOrder(Akar); printf(“\n Inorder : “); InOrder(Akar); printf(“\n Postorder : “); PostOrder(Akar); } Menelusuri pohon biner Bersambung ke sini 230

2. Membuat pohon biner seperti Gambar-7.5, dengan insert sesuai nomor, kemudian mencetak simpul satu persatu dengan urutan penelusuran secara : preorder, inorder, dan postorder. Menginsert simpul sesuai dengan nomor simpul void Insert(int n, char X) { int S[20], Top, hasil; int sisa, arah; Simpul *Q; Top = -1; hasil = n; while(hasil > 1) { sisa = n % 2; n = n/2; Top++; S[Top] = sisa; } Q = Akar; while(Top > 0) { arah = S[Top]; Top--; if(arah == 0 ) Q = Q->Left; else Q = Q->Right; arah = S[Top]; Top--; if (arah == 0) Q->Left = P; Q->Right = P; n dan X dikirim dari program induk main () M A C B E L G F Akar Gambar-7.5 Mengisi stack dengan peta arah menuju simpul no. n 1 2 3 5 6 7 Menempatkan Pointer Q menunjuk simpul superordinat simpul yang akan diinsert 12 13 //0tree01.cpp #include<stdio.h> #include<malloc.h> #include<conio.h> struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Akar, *P, Q; void Inisialisasi() { - } void BuatSimpul(char X) void BuatAkar() void PreOrder(Simpul *T) void InOrder(Simpul *T) void PostOrder(Simpul *T) Menginsert simpul no. n nom : berisi nomor simpul, INFOx : berisi INFO setiap nomor di nom 0 1 2 3 4 5 6 7 8 dst nom 1 2 3 5 6 7 12 13 INFOx isi ssma dengan prog. sebelumnya A B C E F G L M void main() { int i, n; char X; int nom[20]={0,1,2,3,5,6,7,12,13}; char INFOx[20] = "0ABCEFGLM"; Inisialisasi(); X=INFOx[1]; BuatSimpul(X); BuatAkar(); for(i=2; i<=8; i++) { n = nom[i]; X=INFOx[i]; BuatSimpul(X); Insert(n,X); } printf(“\n Preorder : “); PreOrder(Akar); printf(“\n Inorder : “); InOrder(Akar); printf(“\n Postorder : “); PostOrder(Akar); isi ssma dengan prog. sebelumnya isi ssma dengan prog. sebelumnya isi ssma dengan prog. sebelumnya isi ssma dengan prog. sebelumnya isi ssma dengan prog. sebelumnya Bersambung ke sini 231

3. Membuat pohon biner seperti Gambar-7.5, (lihat halaman sebelumnya), dengan insert sesuai nomor, kemudian mencetak simpul satu persatu dengan urutan penelusuran secara : preorder, dan inorder, kedua-duanya non recursive M A C B E L G F Akar Gambar-7.5 void InOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *Q; top = -1; Q = T; do { while(Q != NULL) { top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; X = Q->INFO; printf("%c ", X); Q = Q->Right; while( (top > -1 ) || (Q != NULL) ); //0tree02.cpp #include<stdio.h> #include<malloc.h> #include<conio.h> struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Akar, *P, Q; void Inisialisasi() { Akar = NULL; P = NULL; } void BuatSimpul(char X) { P = (Simpul*) malloc (sizeof(Simpul)); P->INFO = X; P->Left = NULL; P->Right = NULL; void BuatAkar() { Akar = P; void Insert(int n, char X) { } Lihat contoh sebelumnya void main() { int i, n; char X; int nom[20]={0,1,2,3,5,6,7,12,13}; char INFOx[20] = "0ABCEFGLM"; Inisialisasi(); X=INFOx[1]; BuatSimpul(X); BuatAkar(); for(i=2; i<=8; i++) { n = nom[i]; X=INFOx[i]; BuatSimpul(X); Insert(n,X); } printf("\n Preorder : “"); PreOrderNonRec(Akar); InOrderNonRec(Akar); void PreOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *Q; top = -1; Q = T; do { while(Q != NULL) { X = Q->INFO; printf("%c ", X); top++; S[top] = Q; Q = Q->Left; } if(top > -1) { Q = S[top]; top --; Q = Q->Right; while( (top > -1 ) || (Q != NULL) ); Ketik program diatas, dan RUN, maka akan Tercetak : Preorder : A B E C F L M G Inorder : B E A L F M C G sambung 232

Dalam program utama (main) ditulis : 4. Sudah ada pohon biner. Jumlah simpul tidak diketahui. Simpul akar ditunjuk oleh pointer Root. Tulis instruksi untuk menghitung dan mencetak jumlah simpul. Catatan : Untuk menghitung jumlah simpul, dapat dilakukan setiap mengunjungi sebuah simpul, maka Jumlah Simpul ditambah satu. Sedangkan mengunjungi setiap simpul dapat dilakukan dengan urutan LevelOrder, PreOrder, InOrder, PostOrder, atau urutan apa saja asal setiap simpul terkunjungi. Berikut ini penelusurannya dicontohkan dengan menggunakan penelusuran secara PreOrder. Fungsi untuk menghitung Jumlah Simpul void HITUNG(Simpul *T) { if(T != NULL) { JUM = JUM + 1); HITUNG(T->Left); HITUNG(T->Right); } Walaupun nama fungsinya dibuat HITUNG, tapi urutan penelusurannya meniru urutan mencetak INFO setiap simpul dengan urutan penelusuran secara PreOrder sebagai berikut : Setiap mengunjungi simpul, bukan mencetak INFO tapi menambah satu ke JUM Dalam program utama (main) ditulis : void main() { - - JUM = 0; HITUNG(Root); printf(“%i”, JUM); } void PreOrder(Simpul *T) { if(T != NULL) { printf("%c ", T->INFO); PreOrder(T->Left); PreOrder(T->Right); } } Jangan lupa JUM harus dibuat bersifat secara Global 5. Sudah ada pohon biner. Jumlah simpul tidak diketahui. Simpul akar ditunjuk oleh pointer Root. Tulis instruksi untuk menghitung dan mencetak Total INFO. Fungsi untuk menghitung Jumlah Simpul void main() { - - TOT = 0; HITUNG(Root); printf(“%i”, TOT); } void HITUNG(Simpul *T) { if(T != NULL) { TOT = TOT + T->INFO); HITUNG(T->Left); HITUNG(T->Right); } Urutan akses, mengi-kuti urutan penelusu-ran Preorder Boleh pilih salah satu dari 3 macam urutan penelusuran 233

7.4. Soal-Soal Latihan Mandiri. Untuk semua soal yang berkaitan dengan algoritma, maka dinyatakan bahwa simpul akar pohon biner yang dijadikan soal, telah ditunjuk oleh pointer Root. Gambar-7.5 E D H B C G A Root F I 1. Tuliskan hasil penelusuran pohon biner pada Gambar-7.5 bila ditelusuri atau dibaca dengan cara : a. Penelusuran preorder c. Penelusuran inorder d. Penelusuran postorder 2. Tuliskan penggalan program (atau fungsi) untuk membaca atau menelusuri sebuah pohon biner tanpa proses recursive bila ditelusuri secara : a. inorder b. preorder 3. Sebuah pohon biner, field INFOnya bertipe integer. Tuliskan penggalan program (atau fungsi) untuk : 5. Sebuah pohon biner, INFOnya bertipe char, satu karakter. Gambarkan pohon biner tersebut bila : Hasil penelusuran bila dicetak : a. b. c. d. e. f. g. Mencetak Jumlah simpul. Mencetak Jumlah simpul daun. Mencetak semua INFO simpul daun Mencetak Total INFO. Mencetak nilai yang terbesar. Mencetak nilai terbesar dan mencetak ada berapa buah nilai terbesar tersebut. Memeriksa apakah ada simpul yang nilainya 85 keatas (>=85). Bila ada cetak perkataan “ADA” serta mencetak ada berapa buah simpul yang nilai INFOnya == 85. Bila tidak ada simpul yang nilai INFOnya == 85, maka cetak perkataan : “TIDAK ADA”. Ditelusuri secara Preorder : Inorder : Postorder : A B C D E E D C B A 6. Sebuah pohon biner, INFOnya bertipe char, satu karakter. Gambarkan pohon biner tersebut bila : Hasil penelusuran bila dicetak : Ditelusuri secara Preorder : Inorder : Postorder : A B C D E B A D C E B D E C A 4. Ada banyak pohon biner yang bila ditelusuri dengan cara preorder, hasilnya sebagai berikut : A B C D E F G H Gambarkan pohon biner tersebut yang : 7. Sebuah pohon biner, INFOnya bertipe char, satu karakter. Gambarkan pohon biner tersebut bila : Hasil penelusuran bila dicetak : Ditelusuri secara Preorder : Inorder : Postorder : A B C D E B A D C E B D E C A a. Mempunyai kedalam minimum. b. Mempunyai kedalam maximum 234