Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

219 Bab 7. Penelusuran (traverse atau traversal ) pohon biner, maksudnya membaca atau mengunjungi (visit) simpul-simpul pohon biner dengan urutan tertentu.

Presentasi serupa


Presentasi berjudul: "219 Bab 7. Penelusuran (traverse atau traversal ) pohon biner, maksudnya membaca atau mengunjungi (visit) simpul-simpul pohon biner dengan urutan tertentu."— Transcript presentasi:

1 219 Bab 7

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 BA + Gambar-7.1 Bila ditelusuri secara Pohon pada Gambar-7.1 Preorder + A B (bentuk PREFIX) Inorder A + B (bentuk INFIX) Postorder A B + (bentuk POSTFIX) maka hasil penelusurannya:

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 219 CB A Gambar-7.2 Bila ditelusuri secara Pohon pada Gambar-7.2 Preorder A B C Inorder B A C Postorder B C A maka hasil penelusurannya:

6 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 BA + 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) CB 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 Bab 7

7 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. 220 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 A B A CB A Preorder : A Inorder : A Postorder: A Gambar-7.3 aGambar-7.3 b Gambar-7.3c 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.3d E JK DF M BC G A H 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 Gambar-7.3 e 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 E J K DF M BC G A H VW Gambar-7.3 f 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

8 E JK DF M BC G A H VW 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 : A Akar KiriKanan B D H EJ K V W AkarKiri Kanan AkarKiriKanan C Akar F M Kiri G Kanan Sehingga didapat hasil penelusuran preorder : A B D H E J K V W C F M G 221 Lihat Gambar-7.3 f Untuk Postorder : Kiri, Kanan, Akar : A AkarKiriKanan B H D EJ V W K AkarKiriKanan AkarKiriKanan C Akar M F Kiri G Kanan Sehingga didapat hasil penelusuran postorder : H D J V W K E B M F G C A Lihat Gambar-7.3f Untuk Inorder : Kiri, Akar, Kanan : A AkarKiriKanan B H D EJ V K W AkarKiriKanan AkarKiriKanan C Akar F M Kiri G Kanan Sehingga didapat hasil penelusuran inorder : H D B J E V K W A F M C G

9 M Z L XY N FG O C I RS H Q J TU DE K VW 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 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. Fungsi Penelusuran Preorder. Ingat : Akar, Kiri, Kanan 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 Penelusuran Inorder. Ingat : Kiri, Akar, Kanan Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : InOrder(Root); 1) Fungsi yang bersifat recursive a.b. 222 void PostOrder (Simpul *T) { if (T != NULL) { PostOrder (T - >Left); PostOrder (T - >Right); printf("%c ", T - >INFO); } Fungsi Penelusuran Postorder. Ingat : Kiri, Kanan, Akar. Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : PostOrder(Root); c. CB A Preorder : A B C Inorder : B A C Postorder: B C A YX + Preorder : + X Y Inorder : X + Y Postorder: X Y + Root recursive

10 a. Fungsi untuk Penelusuran Preorder non recursive. 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); 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. 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); 223 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. Pointer T berisi alamat simpul akar. Simpul akar ditunjuk oleh Pointer Root. &H &D &B &A *s A B D H Q Pertama kali ini diisi dengan alamat simpul akar Root &A = alamat simpul yang INFOnya = ‘A’ non recursive

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

12 225 &A &A &E Q = &J S[1] = &E Q = Q->Left; &A &E &J Q = NULL 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 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; Top = 1Top = 2 Q = &E Top = 0 &A &B Keadaan sesudah loop do-while pertama Masuk loop ke-2 Top = 1 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 == NULL Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if Top > -1 true, Q menunjuk B Top menjadi A Q = Q->Right; Q menunjuk E Cetak : ‘ E ’ Tercetak : A B D E Cetak : ‘ J ’ Tercetak : A B D E J E J DF M BC A T Q if(top > -1) { Q = S[top]; top --; Q = Q->Right; } &A &E &J Q menunjuk simpul J &A &E Q = S[top]; Top--; Q = Q->Right; Q menjadi NULL while((top > -1) || (Q != NULL)); Top > -1 ternyata E J DF M BC A T Q Lanjutkan kesini E J DF M BC A T Q Sampai disini sudah tercetak : A B D E J Keluar dari loop do-while ke-2 Masuk ke loop ke-2 E J DF M BC A Q

13 226 &A Q == NULL Top = 0 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 Top > -1 true, Q menunjuk E Top menjadi A Q = Q->Right; Q menunjuk NULL while((top > -1) || (Q != NULL)); Top > -1 ternyata E J DF M BC A T Q &A &E E J DF M BC A T Q Keluar dari loop ke-3 Masuk ke loop ke-4 Sampai disini sudah tercetak : A B D E J Pada Loop ke-3, tidak mencetak sesuatu, hanya proses kembali ke simpul sebelumnya Q == NULL Q = S[Top]; Top--; 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 > -1 true, Q menunjuk &A Top menjadi -1 Q = Q->Right; Q menunjuk &C Q == NULL Q = S[Top]; Top--; &A Q == NULL Top = 0 E J DF M BC A T Q Q == NULL Q != NULL Keluar dari loop ke-4 Masuk ke loop ke-5

14 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 E J DF M BC A T Q Q == &C Top == &C Q = &F S[0] = &C Q = Q->Left; &C &F Q = NULL 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 X = Q->INFO; printf(“%c “, X); top++; S[top] = Q; Q = Q->Left; Top = 0Top = 1 Q = &C Top = -1 Q menunjuk E Cetak : ‘C’ Tercetak : A B D E J C Cetak : ‘F’ Tercetak : A B D E J C F E J DF M BC A T Q Lanjutkan kesini Sampai disini sudah tercetak : A B D E J if(top > -1) { Q = S[top]; top --; Q = Q->Right; } &C &F Q menunjuk simpul F &C Q = S[top]; Top--; Q = Q->Right; Q meunjuk M while((top > -1) || (Q != NULL)); Top > -1 ternyata E J DF M BC A T Q Sampai disini sudah tercetak : A B D E J C F Keluar dari loop do-while ke-5 Masuk ke loop ke-6 Top > -1 true

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

16 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) ); Sampai disini sudah tercetak : A B D E J C F M &C E J DF M BC A T Q Top = 0 Q == NULL Sekarang ini Q == NULL, Loop tidak dikerjakan, langsung ke if Top > -1 true, Q menunjuk C Top menunjuk -1 Q = Q->Right; Q menunjuk NULL Q = S[Top]; Top--; Q == NULL Top = -1 Q menunjuk NULL while((top > -1) || (Q != NULL)); Top == -1 ternyata E J DF M BC A T Q Q == NULL False Q == NULL ternyata False Nilai Kondisi == FALSE Keluar dari do.. while loop Proses Selesai Telah tercetak : A B D E J C F M if(top > -1) { Q = S[top]; top --; Q = Q->Right; } &C Q menunjuk simpul C Q = S[top]; Top--; Q = Q->Right; Q menjadi NULL E J DF M BC A T Q E J DF M BC A T Q

17 7.3. Contoh Program Membuat pohon biner seperti Gambar-7.5.Kemudian mencetak simpul satu persatu dengan urutan penelusuran secara : preorder, inorder, dan postorder. //trilvl3.cpp #include 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); } 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); } 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. Menelusuri pohon biner Bersambung ke sini 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 M A CB E L GF Akar Gambar-7.5 Lihat cara lain halaman berikutnya

18 231 //0tree01.cpp #include 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) { - } 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; } Bersambung ke sini Menginsert simpul sesuai dengan nomor simpul 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. M A CB E L GF Akar Gambar-7.5 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); } ABCEFGLM nom INFOx dst nom : berisi nomor simpul, INFOx : berisi INFO setiap nomor di nom isi ssma dengan prog. sebelumnya Mengisi stack dengan peta arah menuju simpul no. n Menempatkan Pointer Q menunjuk simpul superordinat simpul yang akan diinsert Menginsert simpul no. n n dan X dikirim dari program induk main ()

19 232 //0tree02.cpp #include struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Akar, *P, Q; 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) ); } void Insert(int n, char X) { } 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) ); } 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 CB E L GF Akar Gambar-7.5 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; } sambung Tercetak : Preorder : A B E C F L M G Inorder : B E A L F M C G Ketik program diatas, dan RUN, maka akan Lihat contoh sebelumnya

20 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. void HITUNG(Simpul *T) { if(T != NULL) { JUM = JUM + 1); HITUNG(T->Left); HITUNG(T->Right); } void PreOrder(Simpul *T) { if(T != NULL) { printf("%c ", T->INFO); PreOrder(T->Left); PreOrder(T->Right); } } Fungsi untuk menghitung Jumlah Simpul Dalam program utama (main) ditulis : void main() { - - JUM = 0; HITUNG(Root); printf(“%i”, JUM); - } 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 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. void HITUNG(Simpul *T) { if(T != NULL) { TOT = TOT + T->INFO); HITUNG(T->Left); HITUNG(T->Right); } Fungsi untuk menghitung Jumlah Simpul void main() { - - TOT = 0; HITUNG(Root); printf(“%i”, TOT); - } Urutan akses, mengi-kuti urutan penelusu-ran Preorder Boleh pilih salah satu dari 3 macam urutan penelusuran

21 7.4. Soal-Soal Latihan Mandiri. Tuliskan hasil penelusuran pohon biner pada Gambar-7.5 bila ditelusuri atau dibaca dengan cara : a. Penelusuran preorder c. Penelusuran inorder d. Penelusuran postorder 1. Gambar-7.5 ED H BC G A Root F I Untuk semua soal yang berkaitan dengan algoritma, maka dinyatakan bahwa simpul akar pohon biner yang dijadikan soal, telah ditunjuk oleh pointer Root Tuliskan penggalan program (atau fungsi) untuk membaca atau menelusuri sebuah pohon biner tanpa proses recursive bila ditelusuri secara : a. inorder b. preorder 2. Sebuah pohon biner, field INFOnya bertipe integer. Tuliskan penggalan program (atau fungsi) untuk : 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 : a. Mempunyai kedalam minimum. b. Mempunyai kedalam maximum 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”. Sebuah pohon biner, INFOnya bertipe char, satu karakter. Gambarkan pohon biner tersebut bila : Ditelusuri secara Hasil penelusuran bila dicetak : 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 : Ditelusuri secara Hasil penelusuran bila dicetak : Preorder : Inorder : Postorder : A B C D E B A D C E B D E C A 7. Sebuah pohon biner, INFOnya bertipe char, satu karakter. Gambarkan pohon biner tersebut bila : Ditelusuri secara Hasil penelusuran bila dicetak : Preorder : Inorder : Postorder : A B C D E B A D C E B D E C A


Download ppt "219 Bab 7. Penelusuran (traverse atau traversal ) pohon biner, maksudnya membaca atau mengunjungi (visit) simpul-simpul pohon biner dengan urutan tertentu."

Presentasi serupa


Iklan oleh Google