Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Penelusuran Bab 7 Pohon Biner 219.

Presentasi serupa


Presentasi berjudul: "Penelusuran Bab 7 Pohon Biner 219."— Transcript presentasi:

1 Penelusuran Bab 7 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 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

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

6 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) Inverse Preorder 2. Inorder (atau symetric order) Inverse Inorder 3. Postorder 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

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. 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 Traverse the left subtree in postorder 2. Visit the root Traverse the right subtree in postorder 3. Traverse the right subtree in preorder 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 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

8 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

9 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

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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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 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

19 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

20 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

21 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


Download ppt "Penelusuran Bab 7 Pohon Biner 219."

Presentasi serupa


Iklan oleh Google