Pohon Biner (Bagian 1) Tim Pengajar IF2110R Semester I 2016/2017 1
Tujuan Mahasiswa memahami definisi pohon dan pohon biner Berdasarkan pemahaman tersebut, mampu membuat fungsi sederhana yang memanipulasi pohon Mahasiswa mampu mengimplementasi fungsi pemroses pohon dalam bahasa C (melalui praktikum) 2
Contoh Persoalan - 1 Menu dalam Aplikasi Komputer Contoh (Ms Word): File Open Close Save Table Draw Insert Table Column Row Delete File Menu Ms Word Table Open Close Save Draw Insert Delete Table Column Row 3
Contoh Persoalan - 2 Susunan bab dalam buku Contoh: Diktat Struktur Data Bagian I. Struktur Data Abstract Data Type ADT JAM dalam Bahasa Algoritmik ADT POINT dalam Bahasa Algoritmik ADT GARIS dalam Bahasa Algoritmik Latihan Soal Koleksi Objek Bagian II Studi Kasus 1 : Polinom Deskripsi Persoalan Studi Kasus 2 : Kemunculan Huruf dan Posisi Pada Pita Karakter Deskripsi Persoalan 4
Pohon keluarga Contoh Persoalan - 3 Contoh: Pohon keluarga bangsawan Inggris Elizabeth II Charles Anne Andrew Edward William Harry Peter Zara Beatrice Eugenie Louise James 5
Akar Akar Pohon SubPohon Pohon SubPohon Definisi Rekursif Pohon: - Akar basis - Sub Pohon (sub himpunan yang berupa pohon) rekurens 6
Definisi Rekursif Pohon Pohon (tree) adalah himpunan terbatas, tidak kosong, dengan elemen sebagai berikut: Sebuah elemen yang dibedakan dari yang lain AKAR Elemen yang lain (jika ada) dibagi-bagi menjadi beberapa sub himpunan yang disjoin dan masingmasing sub himpunan itu adalah pohon SUBPOHON Suffiks -aire pada pohon menunjukkan berapa maksimum subpohon yang dapat dimiliki oleh suatu pohon Binaire (binary) : maksimum subpohon 2 N-aire : maksimum subpohon N 7
Simpul a adalah ayah, simpul b dan simpul c anak. Simpul b adalah saudara dari simpul c Istilah a Ayah (father/parent) Anak (child) Saudara (sibling) b c d e g h Simpul b adalah ayah, simpul d dan simpul e adalah anak. Simpul d adalah saudara dari simpul e i 8
Tingkat (level) : panjang jalan dari akar sampai simpul tertentu. Cth: tingkat (e) = 3, tingkat (i) = 4, Kedalaman (depth) : tingkat terpanjang. Cth: kedalaman pohon=4 b Istilah a c Jalan (path) : urutan tertentu dari cabang, cth: a-c-h-i Lebar (breadth) : maksimum jml simpul pd suatu tingkat. d e g h Daun (leaf) : simpul terminal i Derajat (degree) : banyaknya anak sebuah simpul. Cth, derajat(c)=2, derajat(h)=1, derajat(g)=0 9
Beberapa Ilustrasi Representasi a b c d e f g h d e b f a g c h i Graph i Himpunan a Bentuk Linier Indentasi b d e f c gh Prefix: (a (b (d (), e (), f ()), c ( g (), h ( i ())))) (a (b (d) (e) (f)) (c (g) (h (i)))) Postfix: (((d,e,f) b, (g, (i) h) c) a) i 10
Pohon Biner Pohon biner adalah himpunan terbatas yang mungkin kosong, atau terdiri atas sebuah simpul yang disebut akar dan dua buah himpunan lain yang disjoint yang merupakan pohon biner, yang disebut sebagai sub pohon kiri dan sub pohon kanan dari pohon biner tersebut Perhatikanlah perbedaan pohon biner dengan pohon N-aire: pohon biner mungkin kosong, pohon N-aire tidak mungkin kosong 11
Contoh Pohon Biner + 3 * a 3+(4*5) 4 5 c b Pohon biner condong kiri a a c b d Pohon biner condong kanan b c e Pohon condong/skewed tree 12
ADT Pohon Biner dengan Representasi Berkait dengan Pointer (Bahasa C) #define Nil NULL /* Selektor */ #define Akar(P) (P)->info #define Left(P) (P)->left #define Right(P) (P)->right typedef int infotype; typedef struct tnode *addrnode; typedef struct tnode { infotype info; addrnode left; addrnode right; Node; /* Definisi PohonBiner : */ /* Phon Biner kosong : P = Nil */ typedef addrnode BinTree; 13
Konstruktor BinTree Tree (infotype Akar, BinTree L, BinTree R); /* Menghasilkan sebuah pohon biner dari A, L, dan R, jika alokasi berhasil */ /* Menghasilkan pohon kosong (Nil) jika alokasi gagal */ void MakeTree (infotype Akar, BinTree L, BinTree R, BinTree *P); /* I.S. Akar, L, R terdefinisi. P Sembarang */ /* F.S. Membentuk pohon P dengan Akar(P)=Akar, Left(P)=L, dan Right(P)=R jika alokasi berhasil. P = Nil jika alokasi gagal. */ 14
Selektor Jika P adalah BinTree, maka: Akar(P) adalah P->Info {Nilai Akar pohon biner P Left(P) adalah P->Left {Subpohon kiri pohon biner P Right(P) adalah P->Right {Subpohon kanan pohon biner P 15
Memory Management addrnode AlokNode (infotype X); /* Mengirimkan addrnode hasil alokasi sebuah elemen */ /* Jika alokasi berhasil, maka addrnode tidak Nil, dan misalnya menghasilkan P, maka Akar(P) = X, Left(P) = Nil, Right(P)=Nil */ /* Jika alokasi gagal, mengirimkan Nil */ void DealokNode (addrnode P); /* I.S. P terdefinisi */ /* F.S. P dikembalikan ke sistem */ /* Melakukan dealokasi/pengembalian addrnode P */ 16
Predikat Penting - 1 boolean IsTreeEmpty (BinTree P) /* Mengirimkan true jika P adalah pohon biner kosong */ { /* Kamus Lokal */ /* Algoritma */ return (P == Nil); boolean IsTreeOneElmt (BinTree P) /* Mengirimkan true jika P adalah pohon biner tidak kosong dan hanya memiliki 1 elemen */ { /* Kamus Lokal */ /* Algoritma */ if (P!= Nil) { return (Left(P) == Nil && Right(P) == Nil); else { /* Pohon kosong */ return false; 17
Predikat Penting - 2 boolean IsUnerLeft (BinTree P) /* Mengirimkan true jika pohon biner tidak kosong P adalah pohon unerleft: hanya mempunyai subpohon kiri */ { /* Kamus Lokal */ /* Algoritma */ if (P!= Nil) { return (Left(P)!= Nil && Right(P) == Nil); else { /* Pohon kosong */ return false; boolean IsUnerRight (BinTree P) /* Mengirimkan true jika pohon biner tidak kosong P adalah pohon unerright: hanya mempunyai subpohon kanan*/ { /* Kamus Lokal */ /* Algoritma */ if (P!= Nil) { return (Left(P) == Nil && Right(P)!= Nil); else { /* Pohon kosong */ return false; 18
Predikat Penting - 3 boolean IsBiner (BinTree P) /* Mengirimkan true jika pohon biner tidak kosong P adalah pohon biner: mempunyai subpohon kiri dan subpohon kanan*/ { /* Kamus Lokal */ /* Algoritma */ if (P!= Nil) { return (Left(P)!= Nil && Right(P)!= Nil); else { /* Pohon kosong */ return false; 19
Pohon Basis-0 Definisi rekursif Basis: pohon biner kosong adalah pohon biner {menggunakan predikat IsTreeEmpty Rekurens: Pohon biner tidak kosong terdiri dari sebuah simpul akar dan dua anak: sub pohon kiri dan sub pohon kanan. Sub pohon kiri dan sub pohon kanan adalah pohon biner 11/13/2017 IF2110R/Sem. 1 2016/2017/Dari 20
Pohon Basis-1 Definisi rekursif Basis: pohon biner yang hanya terdiri dari akar {menggunakan predikat IsOneElmt Rekurens: Pohon biner tidak kosong terdiri dari sebuah simpul akar dan dua anak yang salah satunya pasti tidak kosong: sub pohon kiri dan sub pohon kanan. Gunakan IsUnerLeft, IsUnerRight, IsBiner untuk memastikan tidak terjadi pemrosesan pada pohon kosong 11/13/2017 IF2110R/Sem. 1 2016/2017/Dari 21
Traversal - Preorder void PreOrder (BinTree P) /* I.S. Pohon P terdefinisi */ /* F.S. Semua node pohon P sudah diproses secara PreOrder: akar, kiri, kanan */ /* Basis : Pohon kosong : tidak ada yang diproses */ /* Rekurens : Proses Akar(P); Proses secara Preorder (Left(P)); Proses secara Preorder (Right(P)) */ { /* KAMUS LOKAL */ /* ALGORITMA */ if (IsTreeEmpty(P)) then /* Basis-0 */ /* do nothing */ else { /* Rekurens, tidak kosong */ Proses(P); PreOrder(Left(P)); PreOrder(Right(P)); 22
Contoh - PrintPreorder void PrintPreorder (BinTree P) /* I.S. P terdefinisi */ /* F.S. Semua simpul P sudah dicetak secara preorder: akar, pohon kiri, dan pohon kanan. Setiap pohon ditandai dengan tanda kurung buka dan kurung tutup (). Pohon kosong ditandai dengan (). */ { /* Kamus Lokal */ /* Algoritma */ printf("("); if (IsTreeEmpty(P)) { /* do nothing */ else { printf("%d",akar(p)); PrintPreorder(Left(P)); PrintPreorder(Right(P)); printf(")"); 23
Traversal - Inorder void InOrder (BinTree P) /* I.S. Pohon P terdefinisi */ /* F.S. Semua node pohon P sudah diproses secara inorder: kiri, akar, kanan */ /* Basis : Pohon kosong : tidak ada yang diproses */ /* Rekurens : Proses secara inorder (Left(P)); Proses Akar(P); Proses secara inorder (Right(P)) */ { /* KAMUS LOKAL */ /* ALGORITMA */ if (IsTreeEmpty(P)) then /* Basis-0 */ /* do nothing */ else { /* Rekurens, tidak kosong */ InOrder(Left(P)); Proses(P); InOrder(Right(P)); 24
Traversal Post-order void PostOrder (BinTree P) /* I.S. Pohon P terdefinisi */ /* F.S. Semua node pohon P sudah diproses secara postorder: kiri, kanan, akar */ /* Basis : Pohon kosong : tidak ada yang diproses */ /* Rekurens : Proses secara postorder (Left(P)); Proses secara postorder (Right(P)); Proses Akar(P); */ { /* KAMUS LOKAL */ /* ALGORITMA */ if (IsTreeEmpty(P)) then /* Basis-0 */ /* do nothing */ else { /* Rekurens, tidak kosong */ PostOrder(Left(P)); PostOrder(Right(P)); Proses(P); 25