1 / 21

219

Bab. 7. Penelusuran. Pohon Biner. 219.

nuri
Télécharger la présentation

219

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bab 7 Penelusuran Pohon Biner 219

  2. 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

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

  4. 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

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

  6. Bab 7 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) + A B Gambar-7.1 Pohon pada Gambar-7.2 Bila ditelusuri secara maka hasil penelusurannya: Preorder A B C Inorder B A C Postorder B C A A B C Karena bukan merupakan arithmetic statement, jadi tidak diistilahkan dengan bentuk INFIX, PREFIX dan POSTFIX Gambar-7.2 Penelusuran Pohon Biner 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 : 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 219

  7. A A A B B C A A B C B C E F D A D E F G B C J K M H D E F G K J M H Gambar-7.3 f V W 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 : Gambar-7.3c Gambar-7.3d Gambar-7.3 a Gambar-7.3 b 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 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

  8. Lihat Gambar-7.3f Untuk Inorder : Kiri, Akar, Kanan : V K W J E H D F M G B Kiri Akar Kanan C Kiri Akar Kanan Kiri Akar Kanan A Kiri Akar Kanan 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 : V W K J E H D M F G Kiri Kanan Akar B C Kiri Kanan Akar Kiri Kanan Akar A Kiri Kanan Akar Sehingga didapat hasil penelusuran postorder : H D J V W K E B M F G C A A B C D E F G J K M H V W 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 : K V W E J D H F M G B Akar Kiri Kanan C Akar Kiri Akar Kiri Kanan Kanan A Akar Kiri Kanan Sehingga didapat hasil penelusuran preorder : A B D H E J K V W C F M G 221

  9. A B C D E F G A + H I J K L M N O X B Y C Q R S T U V W X Y Z 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 Root 7.2 Program (Fungsi) Penelusuran Pohon Biner Preorder : + X Y Inorder : X + Y Postorder: X Y + Preorder : A B C Inorder : B A C Postorder: B C A 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 Postorder. Ingat : Kiri, Kanan, Akar. Fungsi Penelusuran Preorder. Ingat : Akar, Kiri, Kanan Fungsi Penelusuran Inorder. Ingat : Kiri, Akar, Kanan void PostOrder (Simpul *T) { if (T != NULL) { PostOrder(T->Left); PostOrder(T->Right); printf("%c ", T->INFO); } } 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); } } 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

  10. 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 Preordernon 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 Inordernon recursive. Fungsi ini akan dipanggil dari program induk atau fungsi main( ) dengan instruksi : InOrderNonRec(Root); 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)); } Root A &A = alamat simpul yang INFOnya = ‘A’ B 3 2 1 0 -1 D &H &D Q &B H &A *s Pertama kali ini diisi dengan alamat simpul akar 223

  11. A A Q B C B C D E F D E F J M J M Fungsi untuk Penelusuran Preordernon 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[1] = Q; Q = Q->Left; S[2] = Q; Q = Q->Left; S[0] = Q; Q = Q->Left; Sekarang Q jadi NULL Q = T; 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 0 -1 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; &D &B &B &A &A &A Q = &D Q = NULL Top = -1 Q = &A Q = &B Tercetak : A Tercetak : A B Tercetak : A B D if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; while((top > -1) || (Q != NULL)); Q = Q->Right; Q menunjuk simpul D Top--; Q menjadi NULL T ternyata 5 4 3 2 1 0 -1 Top > -1 5 4 3 2 1 0 -1 Keluar dari loop do-while pertama Masuk ke loop ke-2 &D &B Q &B &A &A Sampai disini sudah tercetak : A B D 224

  12. T A B C D E F Q J M T A B C D E F Q J M 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 5 4 3 2 1 0 -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[2] = &J; Q = Q->Left; Karena Q==NULL, maka keluar dari loop, dan sudah tercetak: A B DE J Perhatikan : Top menunjuk S[2] yang berisi alamat simpul J S[1] = &E Q = Q->Left; Q = &E 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; &J &E &E &A &A &A Q = NULL Q = &J Lanjutkan kesini Q = Q->Right; if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; while((top > -1) || (Q != NULL)); Q menjadi NULL Q menunjuk simpul J Top--; T A 5 4 3 2 1 0 -1 ternyata 5 4 3 2 1 0 -1 Top > -1 B C A D E F &J Keluar dari loop do-while ke-2 Masuk ke loop ke-2 &E B C &E J M &A Q &A D E F Q Sampai disini sudah tercetak : A B D E J J M 225

  13. T T A A B B C C Q Q D D E E F F J J M M 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 0 -1 Top > -1 true, B C D E F Q = S[Top]; &E Q menunjuk E J M &A Q Top--; Top menjadi A Q == NULL Q = Q->Right; Q menunjuk NULL Top = 0 while((top > -1) || (Q != NULL)); Q == NULL 5 4 3 2 1 0 -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 Top = 0 Q == NULL Top > -1 true, 5 4 3 2 1 0 -1 Q = S[Top]; Q menunjuk &A Top--; Top menjadi -1 Q = Q->Right; &A Q == NULL Keluar dari loop ke-4 Masuk ke loop ke-5 Q != NULL Q menunjuk &C 226

  14. 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 Q A 5 4 3 2 1 0 -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[1] = &F; Q = Q->Left; Karena Q==NULL, maka keluar dari loop, dan sudah tercetak: A B DE J C F Perhatikan : Top menunjuk S[1] yang berisi alamat simpul F S[0] = &C Q = Q->Left; Q = &C 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 5 4 3 2 1 0 -1 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; T &F A &C &C Q = NULL B C Q = &F Q D E F Lanjutkan kesini J M Top > -1 true Q = Q->Right; if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; while((top > -1) || (Q != NULL)); Q meunjuk M Q menunjuk simpul F Top--; T ternyata A 5 4 3 2 1 0 -1 Top > -1 5 4 3 2 1 0 -1 B C D E F Q Keluar dari loop do-while ke-5 Masuk ke loop ke-6 &F J M &C &C Sampai disini sudah tercetak : A B D E J C F 227

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

  16. T A Q B C D E F J M 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 T Top = 0 Q == NULL Top > -1 true, A 5 4 3 2 1 0 -1 B C Q = S[Top]; Q menunjuk C D E F Top--; Top menunjuk -1 Q J M &C Q = Q->Right; Q = Q->Right; Q menunjuk NULL Q menunjuk NULL if(top > -1) { Q = S[top]; top --; Q = Q->Right; } Q = S[top]; Q menjadi NULL Q menunjuk simpul C Top--; 5 4 3 2 1 0 -1 T 5 4 3 2 1 0 -1 Q A B C &C D E F J M while((top > -1) || (Q != NULL)); Top = -1 T ternyata ternyata Q == NULL Top == -1 Q == NULL A Q 5 4 3 2 1 0 -1 B C 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

  17. Akar A B C E F G L M Gambar-7.5 7.3. Contoh Program. 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) { 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); } } 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

  18. Akar A B C E F G L M Gambar-7.5 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; hasil = n; 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; else Q->Right = P; } n dan X dikirim dari program induk main () Mengisi stack dengan peta arah menuju simpul no. n 1 3 2 5 6 Menempatkan Pointer Q menunjuk simpul superordinat simpul yang akan diinsert 7 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 0 1 2 3 5 6 7 12 13 INFOx 0 A B C E F G L M isi ssma dengan prog. 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 : “); 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

  19. Akar A B C E F G L M Gambar-7.5 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 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); printf("\n Preorder : “"); 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 Preorder : A B E C F L M G Inorder : B E A L F M C G Tercetak : sambung 232

  20. 4. Sudah ada pohon biner. Jumlah simpul tidak diketahui. Simpul akar ditunjuk oleh pointer Root. Tulis instruksi untuk menghitung dan mencetak jumlah simpul. 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. Catatan : 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 PreOrder(Simpul *T) { if(T != NULL) { printf("%c ", T->INFO); PreOrder(T->Left); PreOrder(T->Right); } } void main() { - - JUM = 0; HITUNG(Root); printf(“%i”, JUM); - - } 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

  21. Root A B C D E G F H I Gambar-7.5 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. 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 : Ditelusuri secara 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”. Preorder : Inorder : Postorder : A B C D E E D C B A 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 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 : 4. 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

More Related