Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

INFO LEFT RIGHT INFO LEFT RIGHT FATHER INFO LEFT RIGHT.

Presentasi serupa


Presentasi berjudul: "INFO LEFT RIGHT INFO LEFT RIGHT FATHER INFO LEFT RIGHT."— Transcript presentasi:

1

2 INFO LEFT RIGHT INFO LEFT RIGHT FATHER INFO LEFT RIGHT

3

4 typedef struct Node { struct Node *LEFT; int INFO; struct Node *RIGHT; }; typedef struct Node Simpul; typedef struct Node { int INFO; struct Node *LEFT; struct Node *RIGHT; }; typedef struct Node Simpul; INFO LEFT RIGHT atau

5 INFO LEFT RIGHT typedef struct Node { struct Node *LEFT; int INFO; struct Node *RIGHT; }; typedef struct Node Simpul; typedef struct Node { int INFO; struct Node *LEFT; struct Node *RIGHT; }; typedef struct Node Simpul; atau

6 INFO LEFT RIGHT FATHER typedef struct Node { struct Node *FATHER; int INFO; struct Node *LEFT; struct Node *RIGHT; }; typedef struct Node Simpul; typedef struct Node { int INFO; struct Node *FATHER; struct Node *LEFT; struct Node *RIGHT; }; typedef struct Node Simpul; atau

7 6.1.1 Beberapa contoh pohon biner dengan kedalaman (depth) d = 3. E JK DF BC A Gambar-6.2 a Stricly Binary Tree G level root

8 E JK D BC A Gambar-6.2 b Stricly Binary Tree level

9 E JK D HI F LM BC G NO A Gambar-6.2 c Complete Binary Tree level depth = 3 root

10 E JK D HI F LM BC G N A Gambar-6.2 d Almost Complete Binary Tree level root

11

12 6.2 Penomoran Simpul Pohon Biner n 2n2n

13 ABCDEFGHI E GH D BC F I A

14 6.4 Proses (Operasi) Pada Pohon Biner. 1. Insialisasi 2. Pembuatan sebuah simpul. 3. Pembuatan simpul akar 4. Penambahan (insert) simpul kedalam sebuah pohon 5. Penghapusan (delete) simpul dari sebuah pohon 6. Pembacaan / Penelusuran pohon biner

15 struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Root, *P, *Q, *R; char X; Mendeklarasikan struktur Simpul Pointer Root digunakan khusus menunjuk simpul akar. Pointer P digunakan khusus menunjuk simpul yang baru dibuat Pointer Q, R digunakan sebagai pointer pembantu Pointer-pointer lain dapat ditambahkan bilamana diperlukan Selain itu dideklarasi juga sebuah variabel X bertipe sama dengan tipe INFO yaitu tipe : char INFO Left Right Struktur SIMPUL *Root*P*Q*R X

16 void BuatSimpul( char X) { P = (Simpul*) malloc(sizeof(Simpul)); if(P != NULL) { P->INFO = X; P->Left = NULL; P->Right = NULL; } else { printf(“Memory Heap Full”); exit(1); } 6.6. Pembuatan Sebuah Simpul P A Fungsi untuk Pembuatan Sebuah Simpul

17 P = (Simpul*) malloc(sizeof(Simpul)); Instruksi Membuat Sebuah Simpul P

18 P P->INFO P->LEFT P->RIGHT

19 P->INFO = X; Mengisi P->INFO dengan data P A Misal variabel X Berisi nilai Karakter ‘A’

20 P->Left = NULL; P->Right = NULL; Mengisi P->LEFT dan P->RIGHT Dengan NULL P A

21

22 void BuatSimpulAkar( ) { if(Root == NUL) { if(P != NULL) { Root = P; Root->Left = NULL; Root->Right = NULL; } else printf(“\n Simpul Belum Dibuat”); } else printf(“Pohon Sudah Ada”); } 6.7 Menjadikan Sebuah Simpul Sebagai Simpul Akar Suatu Pohon A P Root Fungsi untuk Menjadikan Sebuah Simpul Sebagai Simpul Akar

23 6.8 Menambahkan (Insert) Sebuah Simpul ke Pohon Yang Sudah Ada. P B Root A A P B Insert urut nomor simpul atau insert level per level.

24 6.8 Menambahkan (Insert) Sebuah Simpul ke Pohon Yang Sudah Ada Insert urut nomor simpul atau insert level per level. Root->LEFT= P; P B Root A A P B

25 A B P B A P

26 B A P Root->RIGHT = P;

27 6.8.1 Insert urut nomor simpul atau insert level per level.

28 EDF BC G A H Root h EDF BC G A g EDF BC A f ED BC A e B A C B A A ab c 1 D BC A d

29 #include #include struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *P, *Root, *Current; Simpul *Q[129]; int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); } *Q

30

31 int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); } void Inisialisasi () { Root = NULL; P = NULL; } RootP

32

33 int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); } void BuatSimpul( char X) { P = (Simpul…………………); P->INFO = X; P->Left = NULL; P->Right = NULL; } A P

34 int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); } A P void BuatSimpulAkar( ) { Root = P; Root->Left = NULL; Root->Right = NULL; } Root

35

36 int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); } A P Root void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; }

37 void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; } { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Left = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } if(Flag == 0) { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Right = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } i++;

38 void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; } Q Disini berisi alamat simpul no 5 Disini berisi alamat simpul Akar (Root) n2n2n i j Root

39 void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; } { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Left = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } if(Flag == 0) { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Right = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } i++;

40 if(Flag == 0) { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Right = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } i++; Input data untuk diinsert di Q->Left Input data untuk diinsert di Q->Right { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Left = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; }

41 { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Left = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } A P Root B Q P i j Current 1 2 Input data ke-dua dan Insert di Current->Left Sekarang Current masih sama dengan Root

42 if(Flag == 0) { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Right = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } Input data ke-tiga dan Insert di Current->Right A P Root BC Q No.2P i j Root Current Sekarang Current masih sama dengan Root

43 A P BC Q No.2P i j Root Current void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; } I Sudah selesai insert dua simpul Current

44 A P Root BC Q No.2P i j Root Current void InsertUrutNomor() { int i, j, Flag; char X; Flag = 0; i=1; j=1; Q[i] = Root; while(Flag == 0 && j < 127) { X = getche(); i++; } I Current

45

46 A P Root BC Q No.2P i j { X = getche(); if(X != '0') { BuatSimpul(X); Current = Q[i]; Current->Left = P; j++; Q[j] = P; } else { // data habis Flag = 1; j++; Q[j] = NULL; } Input data ke-4 kemudian data ke-4 dan Insert di Current-> Left Current Pindah Nunjuk Simpul No. 2 Current C 4

47

48 void Inisialisasi () { Root = NULL; P = NULL; } void BuatSimpul(char X) { } void BuatSimpulAkar( ) { lihat contoh sebelumnya } void InsertSimpulUrutNomor() { } void BacaUrutNomor() { } int main() { int i, j, Flag; char X; clrscr(); Inisialisasi(); X = getche(); BuatSimpul(X); BuatSimpulAkar(); InsertSimpulUrutNomor(); BacaUrutNomor(); }

49 void BuatSimpul( char X) { P = (Simpul*) malloc(sizeof(Simpul)); if(P != NULL) { P->INFO = X; P->Left = NULL; P->Right = NULL; } else { printf(“Memory Heap Full”); exit(1); }

50 void BacaUrutNomor() { int i,j,n,Counter; i=1; j=1; n=1; Counter=0; printf(“\n”); Q[I] = Root; while(Q[i] != NULL) { Current = Q[i]; printf("%c ", Current->INFO); Counter++; if(Counter == n) { printf(“\n”); Counter=0; n = n*2; } j++; Q[j] = Current->Left; j++; Q[j] = Current->Right; i++; }

51 void BacaUrutNomor() { int i, j, n, Counter; char X; i=1; j=1; n=1; Counter=0; printf(“\n”); while(Q[i] != NULL) { Current = Q[i]; printf("%c ", Current->INFO); Counter++; if(Counter == n) { printf(“\n”); Counter=0; n = n*2; } i++; }

52

53 E K D I BC G NO A H F M L 6 J PQ 7 2

54 6.8.2 Insert Simpul Pada Nomor Simpul Tertentu.

55 M Z L XY N FG O C I S H Q DE K VW B A P Root a 50

56 A C F L Y a Root F 6 6 = nomor simpul F = Nilai INFO

57 A C F L Y a kanan kiri kanan kiri Q Root F 6 6 = nomor simpul F = Nilai INFO

58 A C F L Y a Q Root F 6 6 = nomor simpul F = Nilai INFO

59 A C F L Y a Q Root Top S

60 n = 50; Top = -1; hasil = n; while(hasil > 1) { sisa = n % 2; n = n/2; hasil = n; Top++; S[Top] = sisa; } Top S

61 n = 50; Top = -1; hasil = n; while(hasil > 1) { sisa = n % 2; n = n/2; hasil = n; Top++; S[Top] = sisa; } Top S / 2 = 25 sisa 0 simpan 0 25 / 2 = 12 sisa 1 simpan 1 12 / 2 = 6 sisa 0 simpan 0 6 / 2 = 3 sisa 0 simpan 0 3 / 2 = 1 sisa 1 simpan 1 Selesai bila hasil = 1

62 Q = Root; while(Top > 0 ) { arah = S[Top]; Top--; if(arah = 0 ) Q = Q->Left; else Q = Q->Right; } arah = S[0]; // Top pasti = 0 if(arah == 0 ) Q->Left = P; else { printf(“\n Ada kesalahan”); printf(“\n unt.simpul no.50”); printf(“\n harus insert kiri”); }

63 Q = Root; while(Top > 0 && Q != NULL) { arah = S[Top]; Top--; if(arah == 0 ) Q = Q->Left; else Q = Q->Right; } if(Q != NULL) { arah = S[0]; if(arah == 0 ) Q->Left = P; else { printf(“\n Ada kesalahan”); printf(“\n unt.simpul no.50”); printf(“\n harus insert kiri”); } else printf( “Simpul Tak Bisa Diinsert” );

64 204

65 210 Q = Root; while(Top > 0 && Q != NULL) { arah = S[Top]; Top--; if(arah == 0 ) Q = Q->Left; else Q = Q->Right; } Sampai disini, bila : Simpul no.25 tidak ditemukan Maka : Q = NULL, walaupun Top menunjuk S[0] Perhatikan langkah-langkah dalam usaha menempatkan pointer Q menunjuk simpul no. 25 (bila ada) Top S A C F L Root Q Keadaan awal. Q menunjuk Root, Top menunjuk S[4] Top S A C F L Root Q Top S A C F L Root Q Top S A C F L Root Q Top S A C F L Root Q Bila simpul no.3 tidak ada, maka Q = NULL, sehingga keluar dari loop, walaupun Top belum menunjuk S[0]. Bila simpul no. 6 tidak ada, maka Q = NULL, sehingga keluar dari loop, walaupun Top belum menunjuk S[0]. Bila simpul no.12 tidak ada, maka Q = NULL, sehingga keluar dari loop, walaupun Top belum menunjuk S[0]. Program-b

66 211 A C F L a Q Root Gambar-6.19 if(Q == NULL) { printf( “ Simpul Tak Bisa Diinsert “ ); printf( “ Simpul Superordinatnya Tidak Ada” ); } else { // Q pasti != NULL & tentunya Top pasti = 0 arah = S[0]; if(arah == 0 ) { if(Q->Left != NULL) printf(“Simpul no.50 Sudah Ada”); else Q->Left = P; } else { printf(“\n Ada kesalahan program”); printf(“\n Untuk Simpul No. 50 “); printf(“\n Seharusnya isi S[0]=0”); } Langkah-2 atau Program Bagian-2. (sambungan Bagian-1). Contoh d Berusaha menginsert sebuah simpul baru menjadi Simpul no. 50. Insert dibatalkan bila : A C F L Y a Q Root Gambar-6.17 a n = 50; Top = -1; hasil = n; while(hasil > 1) { sisa = n % 2; n = n/2; hasil = n; Top++; S[Top] = sisa; } Langkah-1. (Bagian-1) Menentukan langkah untuk menuju simpul no.50 yaitu : 1 – 0 – 0 – dan simpan ke Stack S Top S Gambar-6.17 b Q = Root; while(Top > 0 && Q != NULL) { arah = S[Top]; Top--; if(arah == 0 ) Q = Q->Left; else Q = Q->Right; } a.Simpul no no.25 atau simpul-simpul sebelum no.25 tidak ada, dan cetak perkataan “Simpul Tak Bisa Diinsert”, “Simpul Superordinatnya Tidak Ada “, atau b. Simpul no.50 sudah ada, dan cetak perkataan “ Simpul no.50 Sudah Ada “.

67

68 Membaca Pohon Biner Membaca Pohon Biner level per level urut nomor simpul Membaca atau mencari sebuah simpul dengan nomor tertentu Membaca Pohon Biner level per level urut nomor simpul. E K D I BC G NO A H F M L 6 J PQ 7 Gambar-6.24 a E K D I BC G N A J 7 Gambar-6.24 b E K BC G N A F M 6 J 7 Gambar-6.24 c Perhatikan pohon biner yang diilustrasikan pada empat buah gambar berikut ini : E K BC A J Gambar-6.24 d Pohon –pohon biner diatas, bila dibaca dan dicetak simpul per simpul, dengan pembacaan level per level urut nomor simpul maka : Untuk pohon pada : Gambar-6.24 a Gambar-6.24 b Gambar-6.24 c Gambar-6.24 d Akan tercetak : A B C D E F G H I J K L M N O P Q A B C D E G I J K N A B C E F G J K M N A B C E J K Q 0 &A&B&C \0 &E \ &J&K \ Untuk keperluan algoritma, maka diperlukan sebuah array (biasanya diberi nama Q) bertipe pointer Simpul, untuk mencatat alamat simpul- simpul. Sebagai contoh, untuk pohon biner yang diilustrasikan dengan Gambar-6.24 d, maka alamat simpul-simpulnya tersimpan dalam array pointer seperti yang digambarkan pada Gambar Catatan : &A maksudnya alamat simpul A, \0 untuk menyatakan NULL Gambar-6.25

69 218 #include struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Q[50]; Simpul *Current, *Akar, *P; int i,j; char X; - - disini membuat pohon binernya - ( tidak dibahas ). - // mencetak isi simpul-simpul pohon biner for(i=0; i<=49; i++) { Q[i] = NULL; } Q[0] = Akar; i=0; j=0; while(Q[i] != NULL) { Current = Q[i]; printf("%c ", Current->INFO); if(Current->Left != NULL) { j++; Q[j] = Current->Left; } if(Current->Right != NULL) { j++; Q[j] = Current->Right; } i++; } Menyiapkan array Q Bertipe Pointer untuk menunjuk Simpul Disini membuat simpul-simpul pohon biner. Bagaimana membuat pohon biner sudah diterangkan sebelumnya. Menyimpan alamat simpul subpohon kiri (kalau ada) ke dalam array Q Menyimpan alamat simpul subpohon kanan (kalau ada) ke dalam array Q Apakah simpul subpohon kiri ada ? Mengisi seluruh elemen array Q dengan NULL. Untuk pertama kali, alamat simpul akar disimpan di Q[0]. Alamat simpul akar pasti bukan NULL. Algoritma mencetak simpul level per level urut nompor simpul

70 219 //trilvl2.cpp #include #include #include struct Node { struct Node *Left; char INFO; struct Node *Right; }; typedef struct Node Simpul; Simpul *Q[50], *Current, *Akar, *P; int i,j; char X; void Inisialisasi() { Akar = NULL; P = NULL; } void BuatSimpul(char X) { P = (Simpul*) malloc(sizeof(Simpul)); if(P !=NULL) { P->INFO = X; P->Left = NULL; P->Right = NULL; } else printf("Simpul Tak Bis Dibuat "); } void BuatAkar() { if (Akar == NULL) { if(P != NULL) {Akar = P; } else { printf("Simpul Belum Ada"); } } else { printf("Akar Sudah Ada "); } } 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; for(i=0;i<=49;i++) { Q[i] = NULL; } Q[0] = Akar; i=0; j=0; while(Q[i] != NULL) { Current = Q[i]; printf("%c ", Current->INFO); if(Current->Left != NULL) { j++; Q[j] = Current->Left; } if(Current->Right != NULL) { j++; Q[j] = Current->Right; } i++; } M A CB E L GF Akar Program ini akan membuat Pohon sepert diatas, Dan mencetak level per level sehingga tercetak ; A B C E F G L M Ketik dan RUN program ini untuk melihat hasil pembacaan simpul pohon biner level per level urut nomor simpul. Instruksi-instruksi untuk meng-insert simpul sengaja dibuat secara ‘manual’ hanya untuk memudahkan membuat pohon. Meng-insert simpul secara ‘program’ dapat dilihat pada contoh sebelumnya. Gambar pohon yang dibuat secara ‘manual’ oleh program ini 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.

71 Algoritma mencetak simpul level per level sama dengan menginsert simpul level per level sebagai berikut : A Root LastKiri B C DE Current F P G HIJKL Q Pertama kali pointer Q dan LastKiri ditempatkan menunjuk simpul Akar ( Gambar-6-24 a ). Pointer Q akan mengunjungi simpul satu persatu mulai simpul A, B, C, D dan seterusnya dengan instruksi Q = Q->LEFT untuk turun ke level berikutnya, dan kemudian Q= Q->LINK untuk berjalan ke kanan sampai Q- >LINK == NULL. void BacaPerLevel() { Q = Root; LastKiri = Root; printf("%c ", Q->INFO ); while(Q->Left != NULL) { Q = Q->Left; LastKiri = LastKiri->Left; printf("%c ",Q->INFO); while(Q->Link != NULL) { Q = Q->Link; printf("%c ",Q->INFO); } Q = LastKiri; } Fungsi untuk membaca simpul level per level void BacaPerLevel() { Q = Root; LastKiri = Root; printf("%c ", Q->INFO ); while(Q->Left != NULL) { printf("\n"); Q = Q->Left; LastKiri = LastKiri->Left; printf("%c ",Q->INFO); while(Q->Link != NULL) { Q = Q->Link; printf("%c ",Q->INFO); } Q = LastKiri; } Program-1 Program-2 Bila pohon seperti Gambar-6.24 a atau Gambar-6.24 b, dicetak : Dengan : Program-1 akan mencetak : A B C D E F G H I J K L Dengan : Program-2 akan mencetak : A B C D E F G H I J K L Gambar-6.24 a Gambar-6.24 b LastKiri Q A Root B C DE Current F P G HIJKL 220 E JK DF M BC G A H VW Catatan : Program diatas tidak bisa digunakan untuk mencetak pohon yang no. simpulnya tidak urut seperti Gambar-6.25 Gambar-6.25 Membaca Pohon Biner level per level urut nomor pada pohon yang menggunakan pointer link pada level yang sama.

72 //Membuat pohon dengan insert level per level #include #include #include struct Node { struct Node *Left; char INFO; struct Node *Right; struct Node *Link; }; typedef struct Node Simpul; Simpul *P,*Q, *Root, Simpul *LastCurrent, *Current, *LastKiri ; const kiri = 0, kanan = 1; int i, n, Flag, FlagHabis, Level; char X, A[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; void Inisialisasi () { } void BuatSimpul(char X) { } void BuatSimpulAkar( ) { } void InsertSimpulPerLevel() { } void BacaPerLevel() { } int main() { clrscr(); i=0; X=A[i]; Inisialisasi(); BuatSimpul(X); BuatSimpulAkar(X); for(i=1; i<=25; i++) { X=A[i]; BuatSimpul(X); InsertSimpulPerLevel(); } printf(“\n”); BacaPerLevel(); return(0); } Bentuk Program selengkapnya. Membaca pohon biner level per level Untuk memudahkan pengetesan program, data yang akan diisikan ke simpul pohon, disiapkan berupa array sehingga tidak perlu diketik setiap kali melakukan pengetesan. Jumlah data dapat ditambah atau dikurangi sesuai keperluan Bila Program ini dijalankan, maka akan terbentuk pohon seperti yang diilustrasikan pada Gambar-6.26 Lengkapi semua fungsi sesuai dengan yang telah diuraikan sebelumnya Semua variabel, dibuat dan digunakan secara bersifat Global M Z L XY N FG O C I RS H Q J TU DE K VW B A P Kalau program ini dijalankan (setelah melengkapi fungsi-fungsi yang diperlukan), maka dalam memory akan terbentuk pohon biner sebagai berikut : Tentu saja pohon ini tidak terlihat atau tergambar di layar, karena pohon adanya di dalam memory komputer, dalam bentuk Linked-List. Setelah dicetak dengan fungsi BacaPerLevel( ), maka yang tercetak dan terlihat dilayar adalah : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Gambar

73 Membaca atau mencari sebuah simpul dengan nomor tertentu. Contoh-1: Sudah ada sebuah pohon biner. Strujtur simpul sama seperti yang dicontohkan dalam bab ini. Jumlah simpul dan kedalaman pohon tidak diketahui. Simpul akar ditunjuk oleh pointer Root. Sudah tersedia pointer P, Q, dan R yang dapat menunjuk alamat sebuah simpul, dapat digunakan bila diperlukan. Susun algoritma untuk : Memeriksa apakah simpul dengan nomor 50 ada terdapat dalam pohon tersebut. Bila ada, cetak perkataan “ADA’”, bila tidak ada, cetak perkataan “TIDAK ADA”. // Tahap-2. Q = Root; while(Top >= 0 && Q != NULL) { arah = S[Top]; Top--; if(arah == 0 ) Q = Q->Left; else Q = Q->Right; } if (Q != NULL) printf(“ADA”); Else printf(“TIDAK ADA”); Top S Gambar- b A C F L Y a Q Root Gambar- a // Tahap-1. n = 50; Top = -1; hasil = n; while(hasil > 1) { sisa = n % 2; n = n/2; hasil = n; Top++; S[Top] = sisa; } Jawab : Program terdiri dari 2 tahap. Menentukan alur pencarian untuk menuju simpul no 50. Alurnya adalah : kanan - kiri – kiri - kanan – kiri (lihat Gambar- a) Bila kanan dinyatakan dengan 1, dan kiri dengan 0, maka alurnya menjadi : 1 – 0 – 0 – 1 – 0 Dan menyimpan nilai tersebut kedalam Stack S. (lihat Gambar b) Tahap-1 : Tahap-2 :Berdasarkan nilai yang ada dalam Stack. S, pohon ditelusuri mulai dari simpul akar. Bila simpul no 50 ada, maka cetak perkataan “ADA, sebaliknya cetak perkataan “TIDAK ADA”. Bagi terus menerus 50 dengan 2. Sisa pembagian simpan di Stack S. Proses selesai bila hasil sudah = / 2 = 25 sisa = 0 25 / 2 = / 2 = / 2 = / 2 = 1 1 Keluar dari Loop bila : Top == -1 atau Q == NULL. Bila Q == NULL berarti, simpul no 50, atau no. 25, atau no. 12, atau no. 6 atau no. 3, atau no. 1 tidak ada. hasil

74 6.11 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-6.27 a diatas, sebenarnya adalah hasil representasi arithmatic statement : A + B ke dalam pohon biner. 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). 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-6-27 b BA + Gambar-6.27 a Pohon pada Gambar-6.27 a Bila ditelusuri secara maka hasil penelusurannya: Preorder + A B (bentuk PREFIX) Inorder A + B (bentuk INFIX) Postorder A B + (bentuk POSTFIX) CB A Gambar-6.27 b Pohon pada Gambar-6.27 b 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 Dari dua ilustrasi diatas, dapat dilihat sebagai berikut: Untuk penelusuran Preorder, urutannya adalah : Ambil Akar, kemudian telusuri secara preorder subpohon kiri, dan setelah selesai penelusuran ke subpohon kiri, kemudian dilanjutkan dengan penelusuran secara preorder ke subpohon kanan. Jadi penelusurannya sendiri 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 223

75 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 : 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-6.28 aGambar-6.28 b Gambar-6.28c 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-6.28d E JK DF M BC G A H E JK DF M BC G A H VW 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-6.28 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 Gambar-6.28 f Lihat Gambar-6.28 f Untuk Preorder : Akar, Kiri, Kanan : A AkarKiriKanan B D H EJ K V W Akar Kiri 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 224 Untuk Preorder, ---> AKAR, KIRI, KANAN Untuk Inorder, ----> KIRI, AKAR, KANAN Untuk Postorder, --> KIRI, KANAN, AKAR

76 Hasil penelusuran 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 JK DF M BC G A H VW Gambar-6.28 f Gambar-6.28 f digambarkan ulang Lihat Gambar-6.28 f Untuk Postorder : Kiri, Kanan, Akar : A Akar KiriKanan 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-6.28f Untuk Inorder : Kiri, Akar, Kanan : A Akar KiriKanan 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 M Z L XY N FG O C I RS H Q J TU DE K VW B A P Gambar-6.29 Hasil penelusuran untuk pohon Gambar-6.29 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 225

77 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. a. 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 PostOrder(Simpul *T) { if(T != NULL) { PostOrder(T->Left); PostOrder(T->Right); printf("%c ", T->INFO); } 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); b. Fungsi Penelusuran Inorder. Ingat : Kiri, Akar, Kanan Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : Inorder(Root); c. Fungsi Penelusuran Postorder. Ingat : Kiri, Kanan, Akar. Fungsi ini akan dipanggil dari program induk atau fungsi main() dengan instruksi : Postorder(Root); Perhatikan : 1. Walaupun diusahakan selalu menggunakan variabel Global, agar mudah dipahami, namun ketiga fungsi diatas, semuanya menggunakan variabel Lokal T. Hal ini tidak dapat dihindari karena fungsi bersifat recursive. 2. Setiap simpul yang dikunjungi, nilai INFOnya selalu dicetak agar terlihat dilayar urutan simpul yang dikunjungi. Gunakan ketiga fungsi diatas, sebagai pengganti fungsi BacaPerLevel( ), pada program yang dicontohkan sebelumnya maka akan terlihat hasil penelusuran pohon Gambar-6.25 sebagai berikut : Preorder : A B D H P Q I R S E J T U K V W C F L X Y M Z G N O Inorder : P H Q D R I S B T J U E V K W A X L Y F Z M C N G O Postorder: P Q H R S I D T U J V W K E B X Y L Z M F N O G C A 1) Fungsi yang bersifat recursive 226

78 a. Fungsi untuk Penelusuran Preorder non recursive. void PreOrderNonRec(Simpul *T) { int top, X; Simpul *S[20]; Simpul *P; top = -1; P = T; do { while(P != NULL) { X = P->INFO; printf(“%c “, X); top++; S[top] = P; P = P->Left; } if(top > -1) { P = S[top]; top --; P = P->Right; } while((top > -1) || (P != 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 dikunjunggi. 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 *P; top = -1; P = T; do { while(P != NULL) { top++; S[top] = P; P = P->Left; } if(top > -1) { P = S[top]; top --; X = P->INFO; printf(“%c “, X); P = P->Right; } while((top > -1) || (P != NULL)); } Fungsi ini akan dipanggil dari program induk atau fungsi main( ) dengan instruksi : InOrderNonRec(Root); 227 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.

79 6.12 Pohon Biner Berbenang (Threaded Binary Tree). Pohon biner berbenang (threaded binary tree) adalah pohon biner dimana semua pointer yang bernilai NULL dibuat menjadi benang (thread). Untuk pohon biner dengan jumlah simpul = n, maka akan terdapat pointer benang sebanyak 2n. Jumlah pointer yang bernilai null ada sebanyak n+1, lebih banyak dari pointer yang bukan null (busur) yang jumlahnya = n-1. Untuk pohon biner, semua simpul daun akan mempunyai dua buah benang, benang-kiri dan benang kanan, sedangkan simpul lain mungkin mempunyai salah satu benang, benang-kiri atau benang-kanan, dan sebagian simpul tidak mempunyai benang. Pointer null dibuat menjadi benang karena memang ada gunanya. Benang digunakan untuk menujuk simpul ‘diatas’nya dalam urutan penelusuran inorder. Perhatikan pohon biner berbenang pada Gambar-6-30 berikut ini, dimana benang digambarkan dengan garis putus-putus tipis. Gambar-6.30 Perhatikan aturan pembuatan benang setiap simpul. Untuk keperluan pemrograman, maka dibuatkan sebuah simpul Kepala yang ditunjuk oleh pointer Head. Head->Left dibuat menunjuk akar, sedangkan Head->Right menunjuk simpul Kepala itu sendiri.. Ada dua benang yang khusus menuju ke simpul kepala yanitu benang-kiri simpul paling kiri, dan benang-kanan simpul paling kanan. Bila simpul kepala tidak ada, maka kedua benang ini menunjuk ke simpul akar. Pohon biner pada Gambar-6-30 diatas, bila ditelusuri secara INORDER, maka urutannya adalah : H D R I S B J E A K F C G Pandanglah urutan penelusuran Inorder dari H ke D, atau dari R ke I atau dari S ke B, semuanya dapat dilakukan dengan cepat melalui benang-kanan, tanpa harus melakukan proses secara recursive. Jadi kalau hanya untuk keperluan penelusuran inorder, yang diperlukan hanyalah benang-kanan. Atau dengan perkataan lain, setiap simpul yang mempunyai benang-kanan berarti benang tersebut adalah merupakan jalur untuk penelusuran inorder untuk mencapai akar. D HI B E J K RS A C FG Head Root Catatan : Pengertian simpul successor menurut urutan Inorder, dapat diterangkan menggunakan Gambar Bila berada di simpul R, maka successor inorder adalah simpul I. Bila berada di simpul I, maka successor inorder adalah simpul S. Bila berada di simpul S, maka successor inorder adalah simpul B 228

80 Sekarang timbul persoalan, bagaimana membedakan pointer yang keluar dari sebuah simpul, apakah berfungsi sebagai busur penghubung dua buah simpul, atau berfungsi sebagai benang. Untuk itu dibuat dua buah elemen dalam simpul tersebut yang isinya berupa tanda atau yang dalam pemrograman biasa disebut flag. Sebut saja namanya FlagKiri dan FlagKanan. Bila FlagKiri berisi 0 (nol) maka pointer-kiri (Left) berfungsi sebagai busur atau null, tapi bila isinya = 1 (satu) maka pointer-kiri berfungsi sebagai benang. Demikian juga dengan FlagKanan untuk pointer-kanan Dalam bahas C/C++, struktur simpulnya dapat ditulis sebagai berikut : struct Node { char INFO; int FlagKiri, FlagKanan; struct Node *Right struct Node *Left; }; typedef struct Node Simpul; P->FlagKiri = 0; P->FlagKanan = 0; Dan setiap kali pembuatan sebuah simpul baru, Bila simpul baru tersebut ditunjuk oleh pointer P, maka perlu ditambahkan instruksi : Struktur Simpul Pohon biner berbenang. INFO Flag Kiri Flag Kanan LeftRight Dengan demikian pohon biner berbenang yang digambarkan pada Gambar 6-30 dapat digambarkan lebih jelas dengan Gambar-6.31 sebagai berikut. A 00 B 00 C 00 F 01 C 11 F D 00 H 11 I 00 R 11 S 11 D 01 H 11 Head Root Gambar Struktur Pohon Biner Berbenang 229 void BuatSimpul( char X) {P = (Simpul*) malloc (sizeof(Simpul)); if(P != NULL) { P->INFO = X; P->Left = NULL; P->Right = NULL; P->FlagKiri = 0; P->FlagKanan = 0; } else { printf(“Memory Heap Full”); exit(1); } Seperti yang dicontohkan diatas.

81 Dengan memanfaatkan benang-kanan untuk kembali ke simpul succesor secara inorder, maka penelusuran secara INORDER non recursive dapat dibuat tanpa menggunakan Stack sebagai berikut : Penelusuran INORDER Pohon Biner Berbenang Prosedur Penelusuran INORDER non recursive, pada pohon biner berbenang void InOrderBenang(Simpul *T) { Simpul *Q, *R; Q = T; do { R = Q->Right; if(Q->FlagKanan == 0) { while(R->FlagKiri == 0) { R = R->Left; } } Q = R; if(Q != T) printf("%c ", Q->INFO); } while(Q != T); } Gambar-6.32 Procedeure ini dipanggil dari program utama dengan instruksi InOrderBenang(Head); Bila Pohon pada Gambar-6.32 ditelusuri dengan prosedur ini akan menghasilkan cetakan : D B G E H A F C yaitu hasil penelusuran secara Inorder. B 00 D 11 E 00 G 11 H 11 h 00 T = Head C 01 F 11 A 00 Pohon Gambar-6.28 adalah pohon yang dibuat secara sembarang, tanpa aturan tertentu. Cara membuatnya hanya dengan instruksi-instruksi dasar sebagai berikut : BuatSimpul('A'); BuatSimpulAkar(); BuatSimpul('h'); BuatSimpulHead(); BuatSimpul('B'); Akar->Left = P; BuatSimpul('C'); Akar->Right = P; P->Right = Head; P->FlagKanan = 1; BuatSimpul('D'); Akar->Left->Left = P; P->Left = Head; P->FlagKiri = 1; P->Right = Akar->Left; P->FlagKanan = 1; BuatSimpul('E'); Akar->Left->Right = P; Q = P; BuatSimpul('F'); Akar->Right->Left = P; P->Left = Akar; P->Right = Akar->Right; P->FlagKiri = 1; P->FlagKanan = 1; BuatSimpul('G'); Q->Left = P; P->Left = Akar->Left; P->Right = Q; P->FlagKiri = 1; P->FlagKanan = 1; BuatSimpul('H'); Q->Right = P; P->Left = Q; P->Right = Akar; P->FlagKiri = 1; P->FlagKanan = 1; Penggalan program membuat Pohon Biner Berbenang sembarang seperti Gambar-6.32 Pembuatan pohon dila-kukan secara ‘manual’, satu per satu hanya untuk digunakan seba-gai contoh. Tentu saja pembuatan sebenarnya secara terprogram, sa-ma dengan pembuatan pohon level per level dengan menambahkan benang. 230

82 //Membuat dan menelusuri pohon biner dengan insert level per level //atree05.cpp #include #include #include struct Node { struct Node *Left; char INFO; struct Node *Right; struct Node *Link; }; typedef struct Node Simpul; Simpul *P,*Q, *Akar, *LastCurrent, *Current, *LastKiri ; const int kiri = 0, kanan = 1; int i, n, Flag, FlagHabis, Level; char X, A[35] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; void Inisialisasi () { Akar = NULL; } void BuatSimpul(char item) { P = (Simpul*) malloc(sizeof(Simpul)); if(P !=NULL) { P->INFO = item; P->Left = NULL; P->Right = NULL; P->Link = NULL; } else { printf("Memory Penuh"); exit(1); } void BuatSimpulAkar( ) { if(Akar == NULL) { Akar = P; LastCurrent = Akar; LastKiri = Akar; Flag = kiri; Level = 0; n = 1; FlagHabis = 1; } else { printf("Pohon Sudah ada"); exit(1); } } Contoh Program Program membuat pohon biner dengan insert level per level kiri kanan INFO LeftRight Link P Akar LastCurrent LastKiri kiri Flag Level n FlagHabis INFO LeftRight Link P Simpul baru dibuat Simpul yang baru dibuat dijadikan sebagai simpul Akar Flag = kiri, kalau ada insert, akan diinsert di bagian kiri FlagHabis = 1, jumlah simpul pada level tersebut sudah habis, kalau ada insert, dilanjutkan ke level berikutnya, dan kemudian FlagHabis dibuat = 0. n = 1, jumlah simpul, Level = 0 sekarang sedang ada di level 0 Program bersambug ke-halam berikutnya Catatan :

83 void TambahSimpul() {if(Akar != NULL) { n=n+1; if(FlagHabis == 1) { FlagHabis = 0; Current = P; LastCurrent->Left = P; Flag = kanan; Level = Level + 1; } else {if(Flag == kiri) { Flag = kanan; LastCurrent->Left = P; Current->Link = P; Current = P; } else {LastCurrent->Right = P; Current->Link = P; Flag = kiri; if( n == (pow(2,Level+1)- 1)) { FlagHabis = 1; LastCurrent = LastKiri->Left; LastKiri = LastKiri->Left; } else {Current->Link = P; Current = P; LastCurrent = LastCurrent->Link; } else printf(“Pohon Belum Ada "); } 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); } 232 Menginsert simpul paling kiri dalam suatu level, misal simpul no-2, atau no-4, atau no Akar FlagHabis Menginsert simpul sebelah kiri, tapi bukan yang paling kiri, misal simpul no-6, atau no-10, atau no-12, atau no-14 Menginsert simpul sebelah kanan, termasuk yang paling kanan, seperti simpul no-3, atau no-5 atau no-7, atau no-9, atau no-11 dan seterusnya. Bila yang diinsert adalah simpul yang paling kanan dari suatu level, maka : FlagHabis dibuat = 1, dan LastCurrent dibuat menunjuk simpul paling kiri pada level tersebut. A Link Root LastCurrentLastKiri P B Current Keadaan setelah insert Simpul no-2 n = 2 level = 1 FlagHabis = 0 Flag = kanan n = 3 FlagHabis = 1 Flag = kiri level = 2 A Root LastCurrent LastKiri P B Current C Keadaan setelah insert Simpul no

84 void PostOrder(Simpul *T) { if(T != NULL) { PostOrder(T->Left); PostOrder(T->Right); printf("%c ", T->INFO); } void BacaPerLevel() { Q = Akar; LastKiri = Akar; printf("%c ", Q->INFO ); while(Q->Left != NULL) { printf("\n"); Q = Q->Left; LastKiri = LastKiri->Left; printf("%c ",Q->INFO); while(Q->Link != NULL) { Q = Q->Link; printf("%c ", Q->INFO ); } Q = LastKiri; } int main() { clrscr(); i=0; X=A[i]; Inisialisasi(); BuatSimpul(X); BuatSimpulAkar(X); for(i=1; i<=25; i++) { X=A[i]; BuatSimpul(X); TambahSimpul(); } PreOrder(Akar); printf("\n"); InOrder(Akar); printf("\n"); PostOrder(Akar); printf("\n"); BacaPerLevel(); getch(); return(0); } 233 n = 4 FlagHabis = 0 Flag = kanan level = 2 A Root LastCurrent LastKiri BC P D Current A Root LastCurrent LastKiri BC DE Current P A Root LastCurrent LastKiri B C DE Current P F Keadaan setelah insert Simpul no-4 Keadaan setelah insert Simpul no-5 Keadaan setelah insert Simpul no-7

85 //Membuat dan menelusuri pohon biner berbenang //Benang.cpp #include struct Node { char INFO; int FlagKiri, FlagKanan; struct Node *Right; struct Node *Left; }; typedef struct Node Simpul; Simpul *P,*Q, *Akar, *Head; void Inisialisasi () { Akar = NULL; Head = NULL; } void BuatSimpul(char X) { P = (Simpul*) malloc(sizeof(Simpul)); if(P !=NULL) { P->INFO = X; P->Left = NULL; P->Right = NULL; P->FlagKiri = 0; P->FlagKanan = 0; } else { printf("Memory Penuh"); exit(1); } void BuatSimpulAkar( ) { if(Akar == NULL) { Akar = P; Akar->INFO = 'A'; } else { printf("Akar Sudah ada"); exit(1); } void BuatSimpulHead( ) { if(Head == NULL) { Head = P; Head->Left = Akar; Head->Right = Head; } else { printf("Head Sudah ada"); exit(1); } Program membuat pohon biner berbenang 234 B 00 D 11 E 00 G 11 H 11 h 00 Head C 01 F 11 A 00 INFO Flag Kiri Flag Kanan LeftRight X 00 Akar Gambar-6.33

86 void InOrderBenang(Simpul *T) { Simpul *Q, *R; Q = T; do { R = Q->Right; if(Q->FlagKanan == 0) { while(R->FlagKiri == 0) { R = R->Left; } } Q = R; if(Q != T) printf("%c ", Q->INFO); } while(Q != T); } int main() { clrscr(); Inisialisasi(); BuatSimpul('A'); BuatSimpulAkar(); BuatSimpul('h'); BuatSimpulHead(); BuatSimpul('B'); Akar->Left = P; BuatSimpul('C'); Akar->Right = P; P->Right = Head; P->FlagKanan = 1; BuatSimpul('D'); Akar->Left->Left = P; P->Left = Head; P->FlagKiri = 1; P->Right = Akar->Left; P->FlagKanan = 1; BuatSimpul('E'); Akar->Left->Right = P; Q = P; BuatSimpul('F'); Akar->Right->Left = P; P->Left = Akar; P->Right = Akar->Right; P->FlagKiri = 1; P->FlagKanan = 1; BuatSimpul('G'); Q->Left = P; P->Left = Akar->Left; P->Right = Q; P->FlagKiri = 1; P->FlagKanan = 1; BuatSimpul('H'); Q->Right = P; P->Left = Q; P->Right = Akar; P->FlagKiri = 1; P->FlagKanan = 1; printf("\n"); InOrderBenang(Head); getch(); return(0); } 235 B 00 D 11 E 00 G 11 H 11 h 00 T = Head C 01 F 11 A 00 Gambar-6.34 Catatan : Pembuatan simpul-simpul dilakukan secara manual untuk memudahkan pem-buatan contoh.

87 6.14. Soal-Soal Latihan Mandiri. Sebuah pohon biner kedalamnya = 10. Sebuah pohon biner mempunyai jumlah simpul = 125. Simpan pohon biner Gambar-6.34 diatas ke dalam array satu dimensi. E GH DF I BC A Gambar-6.34 Pada sebuah pohon biner. Bila kita bergerak mulai dari simpul Akar dengan arah gerakan sebagai berikut : kanan, kiri, kanan, kiri, kiri Maka kita akan sampai pada simpul nomor berapa ? Pada sebuah pohon biner. Sebutkan arah gerakan (kiri / kanan) bila bergerak mulai dari simpul Akar menuju simpul no Tuliskan hasil penelusuran pohon biner pada Gambar-6.35 bila ditelusuri atau dibaca dengan cara : a. Penelusuran Level per level b. Penelusuran inorder c. Penelusuran preorder d. Penelusuran postorder 9. Gambar-6.35 ED H BC G A Root F I a. Jumlah maksimum simpul pada level 10. b. Jumlah minimum simpul pada level 10. c. Jumlah maksimum seluruh simpul d. Jumlah minimum seluruh simpul Ditanya : a. Kedalaman maksimum pohon tersebut. b. Kedalaman minimum pohon tersebut. Ditanya : 3.Perhatikan pohon biner Gambar-6.34 diatas. Sebutkan nomor simpul yang isi INFOnya adalah huruf “ I ”. 5. Diketahui sebuah array satu dimensi yang dibuat dengan char A[15]; Sudah ada isinya sebagai berikut : ABCDEFG Gambarkan Pohon Biner-nya bila array satu dimensi diatas direpresentasikan kedalam sebuah pohon biner tersbut 6.Sebuah pohon biner kedalamanya = 7. Berapa paling sedikit elemen array yang perlu disiapkan agar dapat menampung isi pohon biner tersebut. Untuk semua soal yang berkaitan dengan algoritma, maka dinyatakan bahwa simpul akar pohon biner yang dijadikan soal, telah ditunjuk oleh pointer Root. 236

88 237 Gambar-6.36 ED H BC G A Root F I Sudah ada sebuah simpul baru yang ditunjuk oleh pointer P. Tuliskan penggalan program (atau fungsi) untuk menginsert simpul tersebut sebagai simpul no 100, bila dipastikan simpul no 100 belum ada, tapi simpul nomor 50 sudah ada Tuliskan penggalan program (atau fungsi) untuk memeriksa apakah simpul no 100 ada dalam sebuah pohon biner. Bila ada cetak perkataan “ADA”, sebaliknya cetak perkataan “TIDAK ADA”. 19. Sauatu pohon biner, INFOnya bertipe int. Tuliskan penggalan program (atau fungsi) untuk mencetak nilai INFO yang terbesar. 13. 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 : 17 Mempunyai kedalam minimum. Mempunyai kedalam maximum Tuliskan penggalan program (atau fungsi) untuk membaca atau menelusuri sebuah pohon biner tanpa proses recursive bila ditelusuri secara : a. Level per level b. inorder c. preorder 10. Tuliskan penggalan program (atau fungsi) untuk mencetak kedalaman sebuah pohon biner. Gambarkan pohon biner berbenang untuk pohon biner yang digambar pada Gambar Sebuah pohon biner, field INFOnya bertipe integer. Tuliskan penggalan program (atau fungsi) untuk mencetak TOTAL isi INFO. 11. Tuliskan penggalan program (atau fungsi) untuk mencetak JUMLAH simpul sebuah pohon biner Sauatu pohon biner, INFOnya bertipe int. Tuliskan penggalan program (atau fungsi) untuk mencetak nilai INFO simpul yang berada pada ujung paling kanan. 14. Tuliskan penggalan program (atau fungsi) untuk mencetak nomor simpul yang paling besar (paling tinggi). 15. Sudah ada sebuah simpul baru yang ditunjuk oleh pointer P. Tuliskan penggalan program (atau fungsi) untuk menginsert simpul tersebut sebagai simpul no 100, bilamana memungkinkan. Bila tidak mungkin dapat diinsert, maka cetak perkataan “TIDAK DAPAT DIINSERT”. Tidak dapat diinsert bila simpul superordinat dari simpul nomor 100 tidak ada, atau simpul nomor 100 itu sendiri sudah ada.

89 238 Sudah ada pohon biner seperti yang diilustrasikan pada Gambar Susun algoritma untuk membaca dan mencetak isi seluruh simpul sehingga tercetak sebagai berikut : 22. A B D H E J K V W C F H G E JK DF M BC G A H VW Gambar-6-37 Susun algoritma untuk membuat pohon biner untuk menyimpan kalimat : “JAKARTA RAYA INDONESIA “ sehingga terrbuat pohon seperti Gambar AI TA N K R NEO A SI AR Y A A J D Gambar-6.38 Sudah ada pohon biner INFOnya bertipe char. Susun algoritma untuk mencetak INFO seluruh simpul daun. Bila pohonnya seperti pada Gambar 6-37 diatas, maka seharusnya tercetak : 24. H J V W M G Sudah ada dua buah pohon biner. Akar pohon biner pertama ditunjuk oleh pointer Root1. Akar pohon biner kedua ditunjuk oleh pointer Root2. Susun program untuk memeriksa apakah pohon biner pertama tepat sama dengan pohon biner kedua. Yang dimaksud dengan tepat sama disini adalah jumlah dan tata letak simpulnya sama, bukan isi INFOnya. Bila tepat sama cetak perkataan “SAMA”, sebaliknya cetak perkataan “TIDAK SAMA “. 25. E JK DF M BC G A H T XY SU Z QR V P W E J DF M BC G A Pohon pada Gambar-6-39, tepat sama dengan pohon pada Gambar 6-40, walaupun isinya tidak sama, tapi jumlah simpul dan tata letak simpul sama. Sedangkan pohon pada Gambar-6.39 tidak “tepat sama “ dengan pohon pada Gambar-6.41 Gambar-6.39Gambar-6.40Gambar-6.41 Ilustrasi :


Download ppt "INFO LEFT RIGHT INFO LEFT RIGHT FATHER INFO LEFT RIGHT."

Presentasi serupa


Iklan oleh Google