n disebut simpul Merupakan bentuk struktur data tidak linier Biasanya digunakan untuk menggambarkan hubungan yang bersifat hierarkhi, seperti : - strukutur organisasi - pohon klasifikasi / silsilah - pohon sintaks / pohon ekspresi Jenis : Pedigree chart, Linear chart ISTILAH DASAR
TINGKAT
B D E F
C G H
Hubungan antar simpul : bapak, ,anak, paman, dll Tingkat (level) Derajat (degree) Simpul yang derajat = 0 disebut daun / leaf Tinggi (Height) /kedalaman (deepth) : tingkat maksimum 1 Ancestor : semua simpul yang terdapat pada jalur dari akar sampai simpul tersebut Forest (Hutan) : kumpulan sejumlah pohon yang tidak saling berhubungan
MACAM TREE : - Banyaknya anak : binary tree / pedigree chart & Non Binary Tree (N-ary)/Lineal Chart POHON BINER - Adalah kumpulan simpul yang mungkin kosong atau mempunyai akar dan dua subpohon yang saling terpisah (left subtree dan right subtree) - Derajat maksimal = 2 - Complete binary tree tingkat N : pohon biner yang semua daunnya terdapat pada tingkat N dan semua simpul yang lebih kecil dari Npasti mempunyai cabang kiri dan kanan Banyak simpul maksimum pada tingkat N = 2N-1 Banyak simpul maksimum sampai tingkat N = 2 N -1 - Skewed binary tree : pohon biner yang banyaknya simpul cabang kiri tidak seimbang dengan banyak sismpul cabang kanan Contoh : a. Pohon Biner
A B D I J E K L N G M O C H
A B D I J E K F L N A C G M O H D B
A B H D I
C E G
C C
M I
N B
I C
REPRESENTASI POHON BINER Dengan Menggunakan List: Type Infotype : ............{terdefinisi} Type address : ^Node Type Node : < Info : Infotype, Left : address, Right : address > Type BinTree : address Primitif-Primitif Pohon Biner: { Selektor}
Function Akar (P:BinTree) infotype {mengirimkan infomasi yang tersimpan dalam akar dari pohon biner yang tidak kosong} KAMUS ALGORITMA info(P) Function AnakKiri(P:BinTree) infotype {mengirimkan anak kiri dari pohon biner yang tidak kosong} KAMUS ALGORITMA Left(P)
Function AnakKanan(P:BinTree) infotype {mengirimkan anak kanan dari pohon biner yang tidak kosong} KAMUS ALGORITMA Right(P)
Konstruktor
function Tree(A:Infotype, L: BinTree, R :BinTree) BinTree {Menghasilkan sebuah pohon Biner dari A, L dan R jika alokasi berhasil} {Menghasilkan pohon kosong jika alokasi gagal} KAMUS P :BinTree ALGORITMA Allocate(P) Info(P) A Left(P) L Right(P) R P procedure MakeTree(input A:Infotype, L: BinTree, R :BinTree; output P :BinTree) {IS : sembarang} {FS : Menghasilkan sebuah pohon P dari A, L dan R } KAMUS ALGORITMA Info(P) A Left(P) L Right(P) R
Procedure Sisip_SimpulBaru(input A:infoype; input/output P:BinTree) {IS : terdefinisi Ordered BinaryTree P, P mungkin kosong } {FS : simpul baru berisi informasi A terdefinisi dan disisipkan pada Tree P} KAMUS Q,R,Baru : address ALGORITMA Baru SimpulBaru(A) If (P = nil) then {P masih kosong} P Baru Else {P tidak kosong} Q P {kedua pointer bantu menunjuk ke akar Tree P} R P {Mencari letak yang tepat untuk menyisipkan simpul baru} while (A <> Info(Q) and R <> Nil) Q R If A < Info(Q) then {Mencari ke Cabang Kiri} R Left(Q) Else R Right(Q) {Mencari ke Cabang Kanan} If (A = Info(Q)) then {Informasi A sudah ada pd Tree P} Output (simpul sudah ada) Else If (A < Info(P)) then Left(Q) Baru Else Right(Q) Baru
{Predikat Penting}
function IsUnerLeft(P:BinTree) boolean {Prekondisi : P tidak kosong. Mengirmkan True jika P adalah pohon unerleft: hanya mempunyai SubPohon Kiri} KAMUS ALGORITMA Right(P)=Nil and Left(P) Nil function IsUnerRight(P:BinTree) boolean {Prekondisi : P tidak kosong. Mengirmkan True jika P adalah pohon unerright: hanya mempunyai SubPohon Kanan} KAMUS ALGORITMA Leftt(P)=Nil and Right(P) Nil function IsBin(P:BinTree) boolean {Mengirmkan True jika pohon biner tidak kosong, P adalah pohon biner : mempunyai SubPohon Kiri dan Kanan} KAMUS ALGORITMA Leftt(P) Nil and Right(P) Nil
Kunjungan pada Pohon Biner (traversal): Dalam operasi traversal, akan diperoleh secara lengkap informasi yang disimpan pada suatu pohon biner. Urutan Informasi ini sangat tergantung pada letak simpul-simpul pada pohon biner tersebut. Berdasarkan bagaimana traversal itu dilakukan terhadap pohon Biner, kita dapat mengelompokan operasi traversal ke dalam beberpa macam/jenis traversal pada pohon biner yaitu Pre Order(Deepth First Order), In Order, post Order dan Level Order.
A B D I J E K L N G M O C H
PreOrder (Deepth First Order) Urutan traversal/kunjungan : - cetak isi simpul - kunjungi cabang kiri - kunjungi cabang kanan
KAMUS Type Infotype : ............{terdefinisi} Type address : ^Node Type Node : <Info : Infotype, Left : address, Right : address > Type BinTree : address Type addressS : ^ElmtStack ElmtStack : < InfoS : BinTree, Next : addressS > Stack : < TOP : addressS >
Contoh :
0
H
2
A
3
K C
6 7
Simpul yang dikunjungi 0 Left(0) = 1 Right(1) Pop Left(3)=4 Left(4) Pop Left(5) Pop Left(2)=6 Left(6) Pop
Tabel Tracing Program PreOrder Non Rekursif IsiSimpul Alamat yg Isi Stack dipush H Right(0) 2 A Right(1) 23 Nil 23 C Right(3) 25 B Nil 25 Nil 25 D Nil 2 Nil 2 K Right(2) 7 J Nil 7 Nil 7 L Nil
Karakter Tercetak H A C B D K J L
Contoh :
0
H
2
A
3
K C
6 7
Tabel Tracing Program PreOrder Rekursif Pemanggilan Prosedur Isi Simpul Output(Info(0)) PreOrder_Rekursif (Left(0)) Output(Info(1)) PreOrder_Rekursif (Left(1)) Kembali ke tigkat Utama PreOrder_Rekursif (Right(1)) Output(Info(3)) PreOrder_Rekursif (Left(3)) C PreOrder_Rekursif (Left(4)) Kembali ke tingkat 2 PreOrder_Rekursif (Right(3)) Output(Info(5)) PreOrder_Rekursif (Left(5)) Kembali ke tingkat 2 PreOrder_Rekursif (Right(5)) Kembali ke tingkat 2 Kembali ke tingkat 1 Kembali ke tingkat Utama PreOrder_Rekursif (Right(0)) Output (Info(2)) PreOrder_Rekursif (Left(5)) Output (Info(6)) PreOrder_Rekursif (Left(6)) Kembali ke tingkat 1 PreOrder_Rekursif (Right(6)) Kembali ke tingkat 1 H A A Nil C C B B Nil D D Nil Nil H A
Karakter Tercetak
C B
Utama 1 1 2 2 2
K K J J Nil Nil
K J
1 2 2 2
PreOrder_Rekursif (Right(2)) Output (Info(7)) PreOrder_Rekursif (Left(7)) Kembali ke tingkat 1 PreOrder_Rekursif (Right(7)) Kembali ke tingkat 1 Kembali ke Tingkat Utama Selesai
L L Nil Nil
Kunjungan InOrder Urutan InOrder : - kunjungi cabang kiri - cetak simpul - kunjungi cabang kanan
Procedure InOrder(Input P : BinTree) {I.S : terdefinisi Binary Tree P, mungkin kosong} {F.S : Mencetak informasi yang disimpan dalam binary Tree P secara InOrder, non rekursif} Kamus S : Stack Q : BinTree Algoritma If (P = Nil) then Output (Tree Kosong) Else S Nil {Inisialisasi Tumpukan} Q P Repeat While (P Nil) {bergerak terlebih dulu ke cabang kiri dgn mempush akar} push(S,Q) Q Left(Q) {P = Nil} {Mempop dan mencetak ujung tumpukan} Pop(S,Q) Output (Info(Q)) {Bergerak ke kanan} Q Right(Q) Until (S = Nil)
Kunjungan PostOrder Urutan PostOrder : - kunjungi cabang kiri - kunjungi cabang kanan - cetak simpul Kunjungan PostOrder Dengan Rekursif
Procedure Order_Rekursif(Input P : BinTree) {I.S : terdefinisi Binary Tree P, P mungkin kosong} {F.S : Mencetak informasi yang disimpan dalam binary Tree P secara PostOrder, rekursif} Kamus Algoritma If (P Nil) then PostOrder_Rekursif(Left(P)) InOrder_Rekursif(Right(P)) Output (Info(P))