Penelusuran - Google Drive

Download Report

Transcript Penelusuran - Google Drive

Bab
7
219
Penelusuran (traverse atau traversal ) pohon biner,
maksudnya membaca atau mengunjungi (visit)
simpul-simpul pohon biner dengan urutan tertentu.
Ada 3 (tiga) macam penelusuran, yang bila
ditambah dengan kebalikannya menjadi 6 (enam)
macam penelusuran sebagai berikut :
1. Preorder (atau depth-first order)
2. Inorder (atau symetric order)
3. Postorder
4. Inverse Preorder
5. Inverse Inorder
6. Inverse Postorder
Pohon pada Gambar-7.1
+
A
B
Gambar-7.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
Pohon pada Gambar-7.2
A
B
C
Gambar-7.2
Bila ditelusuri
secara
maka hasil
penelusurannya:
Preorder
A B C
Inorder
B A C
Postorder
B C A
219
Bab
7
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. memahami
Postorder
6. Inverse
Untuk
istilah Pre, Post, In, order diatas, pandanglah
sebuah Postorder
pohon atau subpohon sebagai berikut :
+
A
Pohon pada Gambar7.1
B
Bila ditelusuri secara
maka hasil penelusurannya:
Preorder
+ A B (bentuk PREFIX)
Inorder
A + B (bentuk INFIX)
Postorder
A B +statement
(bentuk
Pohon pada Gambar-7.1 diatas, sebenarnya adalah hasil
representasi arithmetic
: A POSTFIX)
+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
Gambar-7.1
A
B
Gambar-7.2
Pohon pada Gambar-7.2
C
Bila ditelusuri secara
Preorder
Inorder
Postorder
maka hasil penelusurannya:
A
B
B
219
B
A
C
C
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. Dalam menelusuri
subpohon kiri, kembali berulang ambil akar dan telusuri subpohon kiri dan seterusnya sampai selesai tidak bisa ditelusuri kekiri lagi yaitu
apabila ditemui pointer Left == NULL. Setelah selesai penelusuran ke subpohon kiri, kemudian dilanjutkan dengan penelusuran secara
preorder ke subpohon kanan. Dalam penelusuran subpohon kanan diulangi lagi penelusuran kekiri dan seterusnya. Jadi penelusurannya
sendiri dapat dibuat bersifat recursive.
Dalam buku literatur, untuk penelusursn preorder ditulis :
1. Visit the root.
2. Traverse the left subtree in preorder.
3. Traverse the right subtree in preorder
Untuk penelusuran inorder :
Untuk penelusuran postorder
1. Traverse the left subtree in preorder.
1. Traverse the left subtree in postorder
2. Visit the root.
2. Traverse the right subtree in postorder
3. Traverse the right subtree in preorder
3. Visit the root.
Agar mudah diingat, prosesnya ketiganya dapat disingkat sebagai berikut :
Untuk Preorder, --->
Untuk Inorder, ---->
Untuk Postorder, -->
7.1
AKAR, KIRI, KANAN
KIRI, AKAR, KANAN
KIRI, KANAN, AKAR
Beberapa contoh pohon biner dan hasil penelusurannya :
A
A
A
A
B
Gambar-7.3 a
B
C
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
A
B
H
B
C
E
J
F
K
F
Gambar-7.3d
A
D
C
E
D
Gambar-7.3c
Gambar-7.3 b
Preorder : A
Inorder : A
Postorder: A
B
C
D
G
H
M
E
K
J
V
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
F
G
M
W
Gambar-7.3 f
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
A
B
C
D
E
J
H
F
K
V
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
G
M
W
Gambar-7.3 f
Lihat Gambar-7.3 f
Untuk Preorder : Akar, Kiri, Kanan :
A
E
B
D H
Akar
Kiri
Akar
Akar
J
Kiri
Kanan
K V W
C
F M
Akar
Kiri
Kanan
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 :
J
H D
B
Kiri
Akar
Kiri
V K W
E
Akar
Kanan
Kanan
A
Kiri
F M
C
Kiri
Akar
Akar
Sehingga didapat hasil penelusuran inorder : H D B J E V K W
G
Kanan
Kanan
A
F M C G
Lihat Gambar-7.3 f
Untuk Postorder : Kiri, Kanan, Akar :
H D
J
V W K
E
Kiri
Kanan
Kanan
Akar
Kiri
B
M F
Akar
Kiri
Kiri
G
Kanan
C
Akar
Kanan
Sehingga didapat hasil penelusuran postorder : H D J V W K E B
221
M F G C
A
Akar
A
G
Kanan
A
B
C
D
E
H
I
Q
P
R
F
J
S
T
K
U
V
G
L
W
M
X
Y
N
Z
O
Gambar-7.4
Hasil penelusuran untuk pohon Gambar-7.4
Preorder : A
B D HPQ IRS E JTU KVW
C
F LXY MZ
GNO
Inorder : PHQ D RIS B TJU E VKW
A
XLY F ZM C NGO
Postorder: PQH RSI D TUJ VWK E B
XYL ZM F NOG C
A
Root
7.2 Program (Fungsi) Penelusuran Pohon Biner
+
A
B
Preorder : A B C
Inorder : B A C
Postorder: B C A
C
X
Y
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.
1) Fungsi yang bersifat
recursive
recursive
a.
Fungsi Penelusuran Preorder.
Ingat : Akar, Kiri, Kanan
b.
Fungsi Penelusuran Inorder. Ingat : Kiri,
Akar, Kanan
void PreOrder (Simpul *T)
void InOrder (Simpul *T)
{ if( T != NULL)
{ if T != NULL)
{ printf("%c ", T->INFO);
c.
Fungsi Penelusuran Postorder. Ingat : Kiri,
Kanan, Akar.
void PostOrder (Simpul *T)
{ if (T != NULL)
{ InOrder(T->Left);
{ PostOrder(T->Left);
PreOrder(T->Left);
printf("%c ", T->INFO);
PostOrder(T->Right);
PreOrder(T->Right);
InOrder(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 :
}
Fungsi ini akan dipanggil dari program
atau fungsi main() dengan
instruksi :
}induk
InOrder(Root);
PostOrder(Root);
222
2) Fungsi yang bersifat non recursive
Proses disini menggunakan Stack, untuk menyimpan alamat simpul-simpul yang telah dikunjungi. Alamat ini penting untuk disimpan
agar dapat kembali menuju akar atau simpul yang ada di ‘atas’ nya. Besarnya Stack tergantung kebutuhan yang lebih dikaitkan dengan
ketinggian atau kedalaman pohon. Karena digunakan untuk menyimpan alamat, maka tipe Stack adalah tipe pointer (menggunakan
bintang (*) ) yakni pointer yang menunjuk suatu Simpul.
a. Fungsi untuk Penelusuran Preorder non recursive.
b.
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;
} Inorder non recursive.
Fungsi Penelusuran
}
> -1) || (Q
!= NULL));
void while((top
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));
Pointer T berisi alamat simpul akar.
Simpul akar ditunjuk oleh Pointer Root.
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
Fungsi ini akan dipanggil dari program induk atau fungsi
main( ) dengan instruksi :
Root
InOrderNonRec(Root);
A
&A = alamat simpul
yang INFOnya = ‘A’
B
&H
D
3 &D
2 &B
Q
H
1 &A
0 *s
-1
Pertama kali ini diisi dengan alamat simpul
akar
223
Fungsi untuk Penelusuran Preorder non recursive.
Uraian proses langkah per langkah
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;
Top = 0
}
Top = -1
S[0] = Q;
Q = T; }
Q = Q->Left;
Q != NULL
true|| (Q != NULL));
while((top
> -1)
}
5
5
X = Q->INFO;
4
4
printf(“%c “, X);
top++; S[top] = Q;
3
3
Q = Q->Left;
2
2
AWAL :
&A
1
0 = &B
Q
-1
1
0 = -1
Top
-1
Q = &A
Tercetak : A
if(top > -1)
{ Q = S[top];
top --;
Q = Q->Right;
}
A
B
Q
C
D
E
J
A
B
F
M
5
4
3
2
1
0
-1
&D
&B
&A
E
ABDEJCFM
Top = 1
S[1] = Q;
Q = Q->Left;
Top = 2
S[2] = Q;
Q = Q->Left;
5
4
3
2 &B
&A
1
0 = &D
Q
-1
5
4
3 &D
2 &B
&A
1
Q =0 NULL
-1
while((top > -1)
|| (Q != NULL));
Q = Q->Right;
Q menjadi NULL
T
ternyata
Top > -1
B
D
Sekarang
Q jadi NULL
Karena Q==NULL, maka keluar
dari inner loop, dan
sudah
tercetak: A B D.
Perhatikan :
Top menunjuk S[2] yang berisi
alamat simpul D
Tercetak : A B D
A
224
M
Bila dicetak hasil penelusuran secara
PREORDER, akan tercetak :
Tercetak : A B
&B
&A
F
J
Top--;
5
4
3
2
1
0
-1
C
D
Q = S[top];
Q menunjuk
simpul D
T
Q
C
E
Q
J
Keluar dari loop
F
do-while pertama
M
Masuk ke loop ke-2
Sampai disini sudah
tercetak : A B D
Keadaan sesudah loop
do-while pertama
Masuk loop ke-2
5
4
3
2
1
0
-1
do
A
B
D
&B
&A
E
Q
J
Top = 1
Q == NULL
Top = 0
Q = &E
5
4
3
2
1
0
-1
Sekarang ini Q ==
NULL,
Loop tidak
dikerjakan, langsung
ke if
Top > -1 true,
{ while(Q != NULL)
{ X = Q->INFO;
printf(“%c “, X);
C
top++; S[top] = Q;
Q = Q->Left;
F
}
if(top > -1)
M
{ Q = S[top]; top --;
Q = Q->Right;
}
}
while((top
> -1) ||
Cetak
: ‘E’
Cetak : ‘J’
Tercetak : A B D E(Q != NULL) Tercetak
); : A B D E J
Top = 1
Top = 2
S[2] = &J;
S[1] = &E
Q = Q->Left;
Q = Q->Left;
T
X = Q->INFO;
printf(“%c “, X);
top++; S[top] = Q;
Q = Q->Left;
Q menunjuk E
Karena Q==NULL, maka keluar
dari loop, dan sudah tercetak:
ABDEJ
5
4
3 &J
2 &E
&A
1
0 = NULL
Q
-1
5
4
3
2 &E
&A
1
0 = &J
Q
-1
&A
Q menunjuk B
Top menjadi A
Q = Q->Right;
Perhatikan :
Top menunjuk S[2] yang berisi
alamat simpul J
T
A
B
D
Lanjutkan kesini
Q
if(top > -1)
{ Q = S[top];
top --;
Q = Q->Right;
}
B
C
E
Q
J
F
M
5
4
3
2
1
0
-1
&J
&E
&A
E
F
J
while((top > -1)
|| (Q != NULL));
Q menjadi NULL
T
Top--;
Q menunjuk
simpul J
A
D
Q = Q->Right;
Q = S[top];
C
A
5
4
3
2
1
0
-1
B
C
D
&E
&A
225
E
J
ternyata
Top > -1
F
Q
M
Keluar dari loop
do-while ke-2
Masuk ke loop ke-2
Sampai disini sudah
tercetak : A B D E J
M
Keadaan sesudah loop
do-while ke-2
Dan masuk ke loop ke-3
do
{ while(Q != NULL)
{ X = Q->INFO;
printf(“%c “, X);
top++; S[top] = Q;
Q = Q->Left;
}
if(top > -1)
{ Q = S[top]; top --;
Q = Q->Right;
}
}
while((top > -1) ||
(Q != NULL)
);
T
A
5
4
3
2
1
0
-1
B
C
D
E
&E
&A
J
F
M
Q
Q == NULL
Top = 0
Q == NULL
B
C
D
E
M
T
A
B
C
D
E
Q
J
&A
Q == NULL
Q = Q->Right;
Q menunjuk NULL
Pada Loop ke-3, tidak mencetak
sesuatu, hanya proses kembali ke
simpul sebelumnya
Sampai disini sudah
tercetak : A B D E J
do
Top = 0
Q == NULL
Top--;
Top menjadi A
Keluar dari loop ke-3
Masuk ke loop ke-4
Q == NULL
Keadaan sesudah loop
do-while ke-3
Dan masuk ke loop ke-4
5
4
3
2
1
0
-1
ternyata
Top > -1
F
Q
J
&A
Q = S[Top];
Q menunjuk E
while((top > -1)
|| (Q != NULL));
T
A
5
4
3
2
1
0
-1
Sekarang ini Q ==
NULL,
Loop tidak
dikerjakan, langsung
ke if
Top > -1 true,
F
M
{ 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;
}
}
Keluar dari loop ke-4
Q !=while
NULL ((top > -1) ||
(Q != NULL) Masuk
); ke loop ke-5
226
Sekarang ini Q ==
NULL,
Loop tidak
dikerjakan, langsung
ke if
Top > -1 true,
Q = S[Top];
Q menunjuk &A
Top--;
Top menjadi -1
Q = Q->Right;
Q menunjuk &C
Keadaan sesudah loop
do-while ke-4
Dan masuk ke loop ke-5
do
Sampai disini sudah
tercetak : A B D E J
T
A
5
4
3
2
1
0
Top == -1
-1
B
D
E
J
Q == &C
Top = -1
Q = &C
5
4
3
2
1
0
-1
Sekarang ini
{ while(Q != NULL)
Q != NULL,
{ X = Q->INFO;
Kerjakan inner loop.
printf(“%c “, X);
Q
top++; S[top] = Q;
C
Q = Q->Left;
}
F
if(top > -1)
{ Q = S[top]; top --;
M
Q = Q->Right;
}
}
while((top > -1) ||
); Cetak : ‘F’
Cetak : ‘C’ (Q != NULL)
Q menunjuk E
Tercetak : A B D E J C
Tercetak : A B D E J C F
Top = 0
Top = 1
Karena Q==NULL, maka keluar
S[1] = &F;
S[0] = &C
dari loop, dan sudah tercetak:
Q = Q->Left;
Q = Q->Left;
ABDEJCF
X = Q->INFO;
printf(“%c “, X);
top++; S[top] = Q;
Q = Q->Left;
5
4
3
2 &F
&C
1
0 = NULL
Q
-1
5
4
3
2
&C
1
0 = &F
Q
-1
Perhatikan :
Top menunjuk S[1] yang berisi
alamat simpul F
T
A
B
D
E
Q
F
J
Lanjutkan kesini
Top > -1 true
if(top > -1)
{ Q = S[top];
top --;
Q = Q->Right;
}
C
Q = Q->Right;
Q = S[top];
Q menunjuk
simpul F
5
4
3
2
1
0
-1
&F
&C
while((top > -1)
|| (Q != NULL));
Q meunjuk M
T
Top--;
A
5
4
3
2
1
0
-1
B
C
D
&C
ternyata
Top > -1
E
J
F
M
Q
Keluar dari loop
do-while ke-5
Masuk
loop ke-6
Sampai
disini ke
sudah
tercetak : A B D E J C F
227
M
Keadaan sesudah loop
do-while ke-5
Dan masuk ke loop ke-6
do
Sampai disini sudah
tercetak : A B D E J C F
Q == &M
Top = 0
T
A
5
4
3
2
1
0
-1
B
D
E
J
&C
Top++;
Top = 0
Q == &M
5
4
3
2
1
0
-1
Sekarang ini
{ while(Q != NULL)
{ X = Q->INFO;
printf(“%c “, X);
top++; S[top] = Q;
Q = Q->Left;
}
C
if(top > -1)
{ Q = S[top]; top --;
F
Q
Q = Q->Right;
M
}
}
while
Cetak : ‘M’ ((top > -1) ||
);
Tercetak : A B D E J C F(Q
M != NULL)
Q menunjuk E
Karena Q==NULL, maka keluar
dari loop, dan sudah tercetak:
ABDEJCFM
T
Perhatikan :
Top menunjuk S[1] yang berisi
alamat simpul M
5
4
3
2 &M
&C
1
0 == NULL
Q
-1
&C
Kerjakan inner loop.
Top = 1
S[1] = &M
Q = Q->Left;
X = Q->INFO;
printf(“%c “, X);
top++; S[top] = Q;
Q = Q->Left;
Q != NULL,
A
B
C
D
E
J
F
Q
Lanjutkan kesini
Top > -1 true
if(top > -1)
{ Q = S[top];
top --;
Q = Q->Right;
}
Q = Q->Right;
Q = S[top];
Q menunjuk
simpul M
5
4
3
2
1
0
-1
&M
&C
while((top > -1)
|| (Q != NULL));
Q meunjuk NULL
T
Top--;
A
5
4
3
2
1
0
-1
B
C
D
&C
ternyata
Top > -1
E
J
F
M
Keluar dari loop
Q
do-while ke-6
Masuk
ke loop ke-7
Sampai disini
sudah
tercetak : A B D E J C F M
228
M
Keadaan sesudah loop
do-while ke-6
Dan masuk ke loop ke-7
do
Q == NULL
Top = 0
T
A
5
4
3
2
1
0
-1
B
C
D
E
F
J
&C
M
if(top > -1)
{ Q = S[top];
top --;
Q = Q->Right;
}
T
5
4
3
2
1
0
-1
Q
C
E
J
F
M
Q = S[Top];
Q menunjuk C
Top--;
Top menunjuk -1
Q = Q->Right;
Q menunjuk NULL
Q menjadi NULL
T
Top--;
Q menunjuk
simpul C
B
D
Q
Q = S[top];
A
Sekarang ini Q ==
NULL,
Loop tidak
dikerjakan, langsung
ke if
Top > -1 true,
{ 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 =);Q->Right;
Sampai disini sudah
tercetak : A B D E J C F M
A
5
4
3
2
1
0
-1
&C
B
C
D
E
Q
F
J
M
while((top > -1) || (Q != NULL));
Top = -1
Q == NULL
5
4
3
2
1
0
-1
T
ternyata
Top == -1
A
B
C
D
E
J
ternyata
Q == NULL
Q
False
F
False
Nilai Kondisi == FALSE
M
Keluar dari do .. while loop
Q == NULL
Proses Selesai
Telah tercetak : A B D E J C F M
229
7.3. Contoh Program.
1.
Akar
Membuat pohon biner seperti Gambar-7.5.Kemudian mencetak simpul
satu persatu dengan urutan penelusuran secara : preorder, inorder, dan
postorder.
A
B
//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;
E
F
L
G
M
Gambar-7.5
Ketik program ini dan RUN
Akan tercetak :
Preorder : A B E C F L M G
Inorder
: BEALFMCG
Postorder : E B L M F G C A
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);
Bersambung ke sini
InOrder(T->Right); }
}
void PostOrder(Simpul *T)
C
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.
void
Lihat cara lain
halaman berikutnya
main()
{ Inisialisasi();
BuatSimpul('A');
BuatSimpul('B');
BuatSimpul('C');
BuatSimpul('G');
BuatSimpul('E');
BuatSimpul('F');
BuatSimpul('L');
BuatSimpul('M');
BuatAkar();
Akar->Left = P;
Akar->Right = P;
Akar->Right->Right = P;
Akar->Left->Right = P;
Akar->Right->Left = P;
Akar->Right->Left->Left = P;
Akar->Right->Left->Right = P;
printf(“\n Preorder : “); PreOrder(Akar);
printf(“\n Inorder
: “); InOrder(Akar);
printf(“\n Postorder : “); PostOrder(Akar);
Menelusuri pohon biner
}
230
2.
Membuat pohon biner seperti Gambar-7.5, dengan
insert sesuai nomor, kemudian mencetak simpul
satu persatu dengan urutan penelusuran secara :
preorder, inorder, dan postorder.
Akar
1
A
2
C 3
B
5
E
12
6
F
L
G
M
13
Gambar-7.5
//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;sebelumnya
isi ssma
dengan
prog.
void Inisialisasi()
isi ssma dengan prog. sebelumnya
{ }
ssma dengan prog. sebelumnya
void isi
BuatSimpul(char
X)
{ } isi ssma dengan prog. sebelumnya
void BuatAkar()
{ -isi ssma dengan prog. sebelumnya
}
void isi
PreOrder(Simpul
*T)
ssma dengan prog. sebelumnya
{ }
void InOrder(Simpul *T) Bersambung ke sini
{ }
void PostOrder(Simpul *T)
{ -
7
Menginsert simpul sesuai dengan nomor simpul
void Insert(int n, char X)
{ int S[20], Top, hasil;
int sisa, arah;
Simpul *Q;
Top = -1;
hasil = n;
while(hasil > 1)
{ sisa = n % 2; n = n/2;
hasil = n;
Top++; S[Top] = sisa;
}
Q = Akar;
while(Top > 0)
{ arah = S[Top]; Top--;
if(arah == 0 )
Q = Q->Left;
else
Q = Q->Right;
}
arah = S[Top]; Top--;
: berisi nomor simpul,
if (arahnom
== 0)
INFOx
Q->Left =: berisi
P; INFO setiap nomor di nom
0
1
2
3
4
5
6
7
else
0
1
2
3
5
6
nom
Q->Right = P;
}
0
A
B
C
E
F
INFOx
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);
231
}
n dan X dikirim dari
program induk main ()
Mengisi stack
dengan peta arah
menuju simpul no. n
Menempatkan
Pointer Q menunjuk
simpul superordinat
simpul yang akan
diinsert
Menginsert simpul
no. n
8
7
G
dst
12
13
L
M
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
Akar
//0tree02.cpp
#include<stdio.h>
#include<malloc.h>
B
#include<conio.h>
struct Node
{ struct Node *Left;
char INFO;
struct Node *Right;
};
typedef
struct Node Simpul;
void Inisialisasi()
Simpul
{ Akar *Akar,
= NULL;*P,P Q;
= NULL;
}
void BuatSimpul(char X)
{ P = (Simpul*) malloc
(sizeof(Simpul));
P->INFO = X; P->Left = NULL;
P->Right = NULL;
}
void BuatAkar()
void
PreOrderNonRec(Simpul
*T)
{ Akar
= P;
{ 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)
);
}
A
E
F
L
Gambar-7.5
sambung
void InOrderNonRec(Simpul *T)
{ int top, X;
Simpul *S[20];
Simpul *Q;
top = -1;
C
Q = T;
G
do
{ while(Q != NULL)
M
{ top++; S[top] = Q;
Q = Q->Left;
}
if(top > -1)
{ Q = S[top]; top --;
X = Q->INFO;
printf("%c ", X);
Q = Q->Right;
}
void Insert(int n,} char X)
{
Lihat contohwhile(
sebelumnya
(top > -1 ) ||
}
(Q != NULL)
);
}
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);
Ketik program
diatas, dan RUN, maka akan
printf("\n Preorder : “");
Tercetak
:
Preorder : A B E C F L M G
InOrderNonRec(Akar);
Inorder
: BEALFMCG
}
232
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);
}
}
Dalam program utama (main)
ditulis :
5.
Walaupun
Setiap mengunjungi simpul, bukan
mencetak INFO tapi menambah satu
ke JUM
nama
fungsinya
dibuat
HITUNG, tapi urutan penelusurannya
meniru urutan mencetak INFO setiap
simpul dengan urutan penelusuran secara
PreOrder sebagai berikut :
void PreOrder(Simpul *T)
void main()
{ if(T != NULL)
{ { printf("%c ", T->INFO);
Jangan lupa JUM harus dibuat
PreOrder(T->Left);
JUM = 0;
PreOrder(T->Right); }
bersifat secara Global
}
HITUNG(Root);
printf(“%i”, JUM);
}
Sudah ada pohon biner. Jumlah simpul tidak diketahui. Simpul akar ditunjuk oleh pointer Root. Tulis instruksi untuk
menghitung dan mencetak Total INFO.
void main()
{ TOT = 0;
HITUNG(Root);
printf(“%i”, TOT);
}
Fungsi untuk menghitung
Jumlah Simpul
void HITUNG(Simpul *T)
{ if(T != NULL)
{ TOT = TOT + T->INFO);
HITUNG(T->Left);
HITUNG(T->Right);
}
}
233
Urutan akses, mengi-kuti
urutan penelusu-ran Preorder
Boleh pilih salah satu dari 3
macam urutan penelusuran
7.4. Soal-Soal Latihan Mandiri.
Untuk semua soal yang berkaitan dengan algoritma, maka dinyatakan bahwa simpul akar pohon biner yang
dijadikan soal, telah ditunjuk oleh pointer Root.
1.
2.
3.
A
Tuliskan hasil penelusuran pohon biner pada Gambar-7.5 bila
ditelusuri atau dibaca dengan cara :
B
C
a. Penelusuran preorder
D
E
G
F
c. Penelusuran inorder
d. penggalan
Penelusuranprogram
postorder(atau fungsi) untuk membaca atau
Tuliskan
H
I
menelusuri sebuah pohon biner tanpa proses recursive bila ditelusuri
secara :
Gambar-7.5
a. inorder
b. preorder
Sebuah pohon biner, field INFOnya bertipe integer. Tuliskan
Sebuah pohon biner, INFOnya bertipe char, satu karakter.
5.
Gambarkan pohon biner tersebut bila :
penggalan program (atau fungsi) untuk :
a.
b.
c.
d.
e.
f.
4.
Root
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.
g.
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
yang nilai INFOnya == 85, maka cetak perkataan :
Adasimpul
banyak
pohon biner yang bila ditelusuri dengan
ADA”.hasilnya sebagai berikut :
cara“TIDAK
preorder,
ABCDEFGH
Ditelusuri secara
Preorder :
Inorder :
Postorder :
6.
Preorder :
Inorder :
Postorder :
Preorder :
Inorder :
Postorder :
234
Hasil penelusuran
bila dicetak :
ABCDE
BADCE
BDECA
Sebuah pohon biner, INFOnya bertipe char, satu karakter.
Gambarkan pohon biner tersebut bila :
Ditelusuri secara
Gambarkan pohon biner tersebut yang :
a. Mempunyai kedalam minimum.
b. Mempunyai kedalam maximum
ABCDE
EDCBA
EDCBA
Sebuah pohon biner, INFOnya bertipe char, satu karakter.
Gambarkan pohon biner tersebut bila :
Ditelusuri secara
7.
Hasil penelusuran
bila dicetak :
Hasil penelusuran
bila dicetak :
ABCDE
BADCE
BDECA