ADT Tree
Suryana Setiawan, Ruli Manurung & Ade Azurat
(acknowledgments: Denny)
Fasilkom UI
SUR HMM AA
Fasilkom UI - IKI20100/IKI80110P
Tujuan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Outline
Tree
Contoh terminologi/definisi
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Contoh
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Contoh
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Contoh
File system
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Istilah-istilah umum:
A is the root node B is the parent of D and E C is the sibling of B D and E are the children of B
Fasilkom UI IKI20100/IKI80110P
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Representasi Tree
Mungkinkah setiap node bisa memiliki link ke setiap anaknya?
Bisa tetapi karena jumlah anak sangat bervariasi menjadikan link langsung tidak feasible, jika dipaksakan akan terjadi pemborosan ruang tak terpakai.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
A D H I K E J A B F D H I K E J G
Suatu Binary Tree
B F G
C
D H I E J
B F G
K
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
10
Binary Tree
Binary tree: tree di mana setiap nodes memiliki maksimum degree 2 Full Binary tree: binary tree di mana setiap nodes memiliki degree 0 atau 2 Perfect Binary tree: binary tree di mana setiap nodes memiliki degree 0 atau 2 dan setiap leaf berada pada level terbawah
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
11
Binary Tree
Complete Binary tree: binary tree dengan tinggi k adalah binary tree yang miliki jumlah maximum nodes di levels 0 sampai k 1, dan pada level k seluruh node mampat ke kiri. Jadi suatu perfect binary tree adalah juga complete binary tree
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
12
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
13
(# nodes at level i) 2i
(# external nodes) 2(height) (height) log2 (# external nodes) (height) log2 (# nodes) - 1 (height) (# internal nodes) = ((# nodes) - 1)/2 Jika tinggi = k, maka #node = 2k+1 - 1
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
14
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
15
ADT tree menyimpan referensi dari root node, yang merupakan awal untuk mengakses tree.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
16
Berfikir Rekursif
Menghitung tinggi tree dapat menjadi program yang rumit bila tidak menerapkan rekursif. Tinggi sebuah tree adalah: maksimum tinggi dari subtree ditambahkan satu (tinggi dari root).
HL+1
HR+1 HL HR
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
17
public static int height (BinaryNode<A> t) { if (t == null) { return -1; } else { return max(height (t.left) + 1, height (t.right) + 1); } }
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
18
sebuah binary tree adalah tree kosong atau terdiri dari sebuah node dengan dua buah sub tree (kiri dan kanan) yang masing-masing adalah tree juga.
Algoritma untuk Binary Tree akan lebih mudah dinyatakan secara rekursif. Binary tree memiliki dua kasus rekursif
Base case: empty leaf external node. Recursive case: Sebuah internal node (root) and dua binary trees (subtree kiri dan subtree kanan)
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
20
Print Pre-Order
class BinaryNode<A> { void printPreOrder() { System.out.println( element ); if( left != null ) left.printPreOrder( ); if( right != null ) right.printPreOrder( ); } } class BinaryTree<A> { public void printPreOrder(){ if( root != null ) root.printPreOrder( ); } } // Node // Left // Right
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
21
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
22
Print Post-Order
class BinaryNode<A> { void printPostOrder( ) { if( left != null ) left.printPostOrder( ); if( right != null ) right.printPostOrder( ); System.out.println( element ); } } class BinaryTree<A> { public void printPostOrder( ) { if( root != null ) root.printPostOrder( ); } }
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
23
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
24
Contoh: Urutan penulisan ekspresi aritmatika Mencetak sebuah expressi aritmatika. print ( before traversing the left subtree print ) after traversing the right subtree
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
25
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
26
Print InOrder
class BinaryNode<A> { void printInOrder( ) { if( left != null ) left.printInOrder( ); // Left System.out.println( element ); // Node if( right != null ) right.printInOrder( ); // Right } } class BinaryTree<A> { public void printInOrder( ) { if( root != null ) root.printInOrder( ); } }
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
27
Traversing Tree
Pre-Order
Post-Order
InOrder
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
28
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
29
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
30
Running Time
Strategy yang digunakan adalah postorder traversal: information dari node dihitung setelah informasi dari seluruh children dihitung. Postorder traversal running time adalah N (jumlah elemen dalam tree) dikalikan beban waktu untuk memproses tiap node. Running time -nya linear karena tiap node hanya diproses sekali dengan beban waktu konstan.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
31
Latihan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
32
Terkadang, kita ingin memroses semua node tanpa peduli urutan. Agar mudah, kita mau looping sederhana Iterator Bagaimana caranya implementasi secara rekursif?
Bayangkan saat current node yang sedang diakses adalah sebuah internal node. Bagaimana menentukan node mana yang akan diakses selanjutnya? Pada fungsi rekursif, informasi ini implisit pada call stack.
33
Kita dapat melakukan traversal non-rekursif dengan membuat stack sendiri. Dengan kata lain, meng-emulasikan: stack of activation records.
Mengapa?
Ya
Kita dapat menyimpan hanya informasi yang penting saja dalam stack, sementara compiler menyimpan seluruh activation record. Namun demikian efisiensi yang dihasilkan tidak akan terlalu besar apalagi dengan teknologi optimisasi 34 compiler SUR HMM AA yang semakin maju. Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
Tree iterator dan traversal-nya diimplementasikan secara non-rekursif menggunakan stack. Lihat code di:
https://telaga.cs.ui.ac.id/WebKuliah/IKI20 100/resources/weiss.code/TestTreeIterators .java
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
35
Post-Order Algorithm/Pseudocode
while (not stack.empty()) node X = pop from the stack switch (state X): case 0: push node X with state 1; push left child node X (if it exists) w/ state 0; break; case 1: push node X with state 2; push right child node X (if it exists) w/ state 0; break; case 2: visit/set current to the node X; return;
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
37
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
38
0. akan melakukan rekursif pada subtree kiri 1. akan memproses node yang dikunjungi 2. akan melakukan rekursif pada subtree kanan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
39
In-Order Algorithm/Pseudocode
init: push the root into the stack with state 0 advance:
while (not stack.empty()) node X = pop from the stack switch (state X):
case 0:
push node X with state 1; push left child node X (if it exists) w/ state 0; break; case 1: push node X with state 2; visit/set current to the node X; return; case 2: push right child node X (if it exists) w/ state 0; break;
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
40
In-Order Algorithm/Pseudocode
init: push the root into the stack with state 0 advance (optimize):
while (not stack.empty()) node X = pop from the stack switch (state X):
case 0:
push node X with state 1; push left child node X (if it exists) w/ state 0; break; case 1:
visit/set current to the node X; push right child node X (if it exists) w/ state 0; return;
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
41
0. akan memproses node yang dikunjungi 1. akan melakukan rekursif pada subtree kiri 2. akan melakukan rekursif pada subtree kanan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
42
Pre-Order Algorithm/Pseudocode
init: push the root into the stack with state 0 advance:
while (not stack.empty()) node X = pop from the stack switch (state X): case 0: visit/set current to the node X; push node X with state 1; break; case 1: push right child node X (if it exists) w/ state 0; push node X with state 2; break; case 2: push left child node X (if it exists) w/ state 0; break;
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08
43
Pre-Order Algorithm/Pseudocode
return;
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
44
Latihan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
45
generic traversal pada binary tree Strategi traversal preorder, inorder, dan postorder adalah kasus khusus dari Euler tour traversal walk around the tree dan kunjungi tiap node tiga kali:
dari arah parent. dari sub tree kiri dari sub tree kanan
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
46
Level-order Traversal
Kunjungi root diikuti oleh seluruh node pada sub tree dari kiri ke kanan kemudian diikuti oleh node pada sub tree-nya lagi. Tree dikunjungi berdasarkan level. Pada tree dibawah urutan kunjungan adalah: A-B-C-D-E-F-G-H-I
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
47
node X = dequeue from the queue visit/set current to the node X; enqueue left child node X (if it exists); enqueue right child node X (if it exists);
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
48
Latihan
Buat program untuk mencetak isi dari sebuah binary tree secara level order
Hint: Coba pikirkan representasi binary tree yang lain, sehingga implementasi level order dapat menjadi lebih sederhana.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
49
Parent (i) terletak pada index i/2 if i 1; for i =1, tidak ada parent. Left-child (i) terletak pada 2i if 2i n. (else tidak ada left-child) Right-child (i)Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil - Pekan 08 terletak pada 2i+1 if 2i +1 n
SUR HMM AA
50
Latihan
Pada ADT tree yang berisikan elemen bilangan bulat. Hitung elemen paling kecil pada leaves dan update seluruh leaves pada tree tersebut dengan elemen terkecil tersebut. (Repmin problem) Tantangan: Apakah algoritma anda dapat melakukannya dengan satu kali traversal?
Input
SUR HMM AA Fasilkom UI IKI20100/IKI80110P
Output
2009/2010 Ganjil - Pekan 08
51