Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

2013. Binary Tree. Contoh Tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Binary Tree kosong Gambar 1. Binary Tree dalam kondisi kosong

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

BINARY SEARCH TREE. TUJUAN UMUM Mahasiswa memahami binary search Tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Algoritma dan Struktur Data. Binary Tree & Binary Search Tree (BST)

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

KUM 6 IMPLEMENTASI BINARY TREE

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

PERANCANGAN SYSTEM PAKAR GENERIC MENGGUNAKAN BINARY TREE

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

METODE AVL TREE UNTUK PENYEIMBANGAN TINGGI BINARY TREE

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Data Structure TREE & BINARY TREE. Chapter 5b. Dahlia Widhyaestoeti, S.Kom

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

BAB VII Tujuan 7.1 Deskripsi dari Binary Tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

POHON CARI BINER (Binary Search Tree)

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

1 Bagian 1: Mencetak isi binary tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

PENGENALAN BINARY INDEXED TREE DAN APLIKASINYA

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Modul 4: Iteratif & Rekursif, Binary Tree

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Membuat Binary Search Tree Menggunakan STL Vector C++

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Topic Complexity of Hashing Search & Binary Search Tree Algorithm

Buatlah sebuah procedure untuk menggandakan semua nilai yang berada dalam sebuah tree

Algoritma dan Struktur Data. Linear & Binary Search Tree

www.hansmichael.com - Bab XI. Manipulasi Binary Tree BAB XI Manipulasi Binary Tree 11.1 Insert Node 11.2 Search Node 11.3 Delete Node 11.4 Copy Tree 11.5 Latihan Soal Binary tree seringkali diterapkan dalam proses searching, sehingga binary tree juga disebut sebagai binary search tree. Konsep dasar binary search tree yaitu bahwa child kiri lebih kecil dari root dan child kanan lebih besar dari root. Agar dapat melaksanakan konsep ini, maka perlu dipahami proses manipulasi binary tree sebagai binary search tree, yaitu insert node, delete node, search node dan copy node. 11.1 Insert Node Proses manipulasi pada binary tree yang pertama kali perlu diketahui adalah proses insert node. Sebelum menginsertkan sebuah node, node yang akan diinsertkan perlu dibuat terlebih dahulu. Proses pembuatan sebuah node baru adalah sebagai berikut: mengalokasikan memori untuk node tersebut dengan fungsi New, dan selanjutnya menginisialisasi node tersebut dengan memasukkan data atau info pada NewNode^.Info dan nilai nil pada NewNode^.LPtr serta NewNode^.RPtr. Berikut ini diberikan sebuah function Create_Node yang berfungsi membuat node baru sesuai dengan langkah-langkah yang telah diberikan. 1: FUNCTION Create_Node(X: BinInfoType): BinTreeType; {Membuat node baru dan mengembalikan pointer dari node baru tersebut} 2: VAR 3: NewNode: BinTreeType; 4: BEGIN 5: New(NewNode); 6: WITH NewNode^ DO 7: BEGIN 8: LPtr := NIL; Program 11.1 Function untuk Membuat Sebuah Node Baru 99

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 100 9: Info := X; 10: RPtr := NIL; 11: END; 12: CreateNode := NewNode; 13: END; Program 11.1 Function untuk Membuat Sebuah Node Baru (Lanjutan) Untuk menginsertkan sebuah node baru ke dalam binary tree dapat dilakukan dengan dua cara, yaitu secara iteratif dan rekursif. Algoritma umum proses insert node secara iteratif adalah sebagai berikut: 1. Jika tree masih kosong (tidak mengandung node) maka arahkan root ke node tersebut dan keluar. 2. Mengarahkan pointer ke alamat node root. 3. Ulangi langkah 4 selama lokasi yang diproses belum kosong. 4. Jika X atau Info yang baru lebih kecil dari node yang diproses maka: a) Jika subtree kiri dari node yang diproses tidak kosong maka arahkan pointer pada node sebelah kiri dari node yang diproses. b) Jika tidak, maka insertkan node baru pada subtree kiri dari node yang diproses dan keluar. 5. Jika X atau Info yang baru lebih besar dari node yang diproses maka: a) Jika subtree kanan dari node yang diproses tidak kosong maka arahkan pointer pada node sebelah kanan dari node yang diproses. b) Jika tidak, maka insertkan node baru pada subtree kanan dari node yang diproses dan keluar. 6. Jika X atau Info yang baru sama dengan node yang diproses maka terjadi duplikasi data. Untuk lebih jelasnya, berikut ini diberikan procedure lengkap untuk proses insert node secara iteratif. 1: PROCEDURE Insert(VAR Root:BinTreeType;X:BinInfoType;VAR Found:Boolean); {Proses insert node pada binary tree} 2: VAR 3: T,NewNode: BinTreeType; Program 11.2 Procedure Insert Secara Iteratif

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 101 4: Finish : Boolean; 5: BEGIN 6: Found := False; 7: NewNode := Create_Node(X); 8: IF Root = NIL THEN 9: Root := NewNode 10: ELSE 11: BEGIN 12: T := Root; 13: Finish := False; 14: WHILE NOT Finish DO 15: BEGIN 16: IF X < T^.Info THEN 17: IF T^.LPtr <> NIL THEN 18: T := T^.LPtr 19: ELSE 20: BEGIN 21: T^.LPtr := NewNode; 22: Finish := True; 23: END 24: ELSE 25: IF X > T^.Info THEN 26: IF T^.RPtr <> NIL THEN 27: T := T^.RPtr 28: ELSE 29: BEGIN 30: T^.RPtr := NewNode; 31: Finish := True; 32: END 33: ELSE 34: BEGIN 35: Finish := True; 36: Found := True; 37: END; 38: END; 39: END; 40: END; {membuat node baru} {jika empty tree} { maka head = newnode} {jika bukan empty tree} {inisialisasi} {kasus 1: insert di subtree kiri} {kasus 2: insert di subtree kanan} {kasus 3: duplikasi data} Program 11.2 Procedure Insert Secara Iteratif (Lanjutan) Setelah mengerti proses insert node secara iteratif, berikut ini akan dijelaskan mengenai proses rekursifnya. Prinsip rekursif diterapkan untuk melakukan proses insert node pada subtree kiri atau kanan dengan sebuah

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 102 pandangan bahwa subtree juga merupakan sebuah tree. Dengan menggunakan prinsip rekursif, maka algoritma umum insert node adalah sebagai berikut 1. Jika tree masih kosong maka arahkan root ke node tersebut dan keluar. 2. Jika X atau Info yang baru lebih kecil dari info dari node yang diproses maka insertkan node baru tersebut ke subtree kiri dari node yang diproses (secara rekursif). 3. Jika X atau Info yang baru lebih besar dari info dari node yang diproses maka insertkan node baru tersebut ke subtree kanan dari node yang diproses (secara rekursif). 4. Jika X atau Info yang baru sama dengan info dari node yang diproses maka terjadi duplikasi data. Berdasarkan algoritma tersebut, maka dapat disusun procedure Insert secara rekursif pada program 11.3. 1: PROCEDURE Insert(VAR Root: BinTreeType; X: BinInfoType; VAR Found: Boolean); {Insert node pada binary tree secara rekursif} 2: BEGIN {kasus 1: create node pada root -> pemberhenti rekursif} 3: IF Root = NIL THEN 4: BEGIN 5: Root := Create_Node(X); 6: Found := False; 7: END 8: ELSE {kasus 2: insert di subtree kiri -> rekursif} 9: IF X < Root^.LPtr THEN 10: Insert(Root^.LPtr,X,Found) 11: ELSE {kasus 3: insert di subtree kanan -> rekursif} 12: IF X > Root^.RPtr THEN 13: Insert(Root^.RPtr,X,Found) 14: ELSE {kasus 4: duplikasi data} 15: Found := True; 16: END; Program 11.3 Procedure Insert Secara Rekursif Dengan melihat proses rekursif dari insert node pada binary tree, ternyata rekursif lebih mudah dibandingkan iteratif, namun mempunyai kelemahan yaitu membutuhkan stack yang cukup besar untuk melakukan proses rekursif.

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 103 11.2 Search Node Operasi selanjutnya yang perlu dipelajari adalah operasi search node pada binary tree. Proses searching ini dapat dilakukan secara iteratif dan dapat pula secara rekursif, seperti halnya pada proses insert node. Pada bagian ini hanya dijelaskan proses rekursifnya saja. Prinsip rekursif dari proses searching adalah sebagai berikut: jika informasi root tidak sama dengan yang diinginkan maka carilah (secara rekursif) pada subtree kiri jika informasi yang diinginkan lebih kecil dari root, dan carilah (secara rekursif) pada subtree kanan jika informasi yang diinginkan lebih besar dari root. Dengan prinsip tersebut, dapat dibuat sebuah procedure Search_Node (program 11.4). 1: PROCEDURE Search_Node(Root: BinTreeType; X: BinInfoType; VAR Location: BinTreeType; VAR Found: Boolean); {Mencari node dengan info X dan menghasilkan Location jika ditemukan. Jika ditemukan maka Found berisi True dan jika tidak maka Found berisi False.} 2: BEGIN {kasus 1: data tidak ketemu} 3: IF Root = NIL THEN 4: Found := False 5: ELSE {kasus 2: data ketemu} 6: IF X = Root^.Info THEN 7: BEGIN 8: Location := Root; 9: Found := True; 10: END 11: ELSE {kasus 3: pencarian pada subtree kiri} 12: IF X < Root^.Info THEN 13: Search_Node(Root^.LPtr,X,Location,Found) 14: ELSE {kasus 4: pencarian pada subtree kanan} 15: Search_Node(Root^.RPtr,X,Location,Found); 16: END; Program 11.4 Procedure Search Suatu Node 11.3 Delete Node Operasi lainnya yang dapat diterapkan pada binary tree adalah proses penghapusan (delete) sebuah node. Proses delete ini dapat dilakukan untuk setiap node dalam binary tree, termasuk root.

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 104 Algoritma umum delete node secara rekursif adalah sebagai berikut: 1. Jika Root = nil maka node tersebut tidak ditemukan. 2. Jika X atau Info yang akan dihapus lebih kecil dari Root^.Info maka lakukan penghapusan Info pada subtree kiri dari Root. 3. Jika X atau Info yang akan dihapus lebih besar dari Root^.Info maka lakukan penghapusan Info pada subtree kanan dari Root. 4. Jika X atau Info yang akan dihapus sama dengan Root^.Info maka: a) Jika Root tersebut merupakan leaf, maka hapuslah Root tersebut dan jadikan Root = NIL. b) Jika Root tersebut tidak mempunyai subtree kanan maka: P = Root, Root = Root^.RPtr, dan hapuslah P. c) Jika Root tersebut mempunyai subtree kanan maka: i) Carilah inorder successor dari node Root. Inorder successor dari node x adalah node setelah node x menurut traversal inorder. ii) Gantilah informasi pada Root dengan informasi dari inorder successornya. iii) Hapuslah node inorder successor Root dengan rootnya adalah Root^.RPtr. Untuk lebih jelasnya dapat dilihat pada procedure Delete (program 11.5) dalam bahasa pemrograman Pascal. 1: PROCEDURE Delete(VAR Root: BinTreeType; X: BinInfoType; VAR Found: Boolean); {Delete node X pada binary tree} 2: VAR 3: P: BinTreeType; 4: BEGIN {kasus 1: empty tree} 5: IF Root = NIL THEN 6: Found := False 7: ELSE {kasus 2: pencarian pada subtree kiri} 8: IF X < Root^.Info THEN 9: Delete(Root^.LPtr,X,Found) 10: ELSE {kasus 3: pencarian pada subtree kanan} 11: IF X > Root^.Info THEN Program 11.5 Procedure Delete Suatu Node

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 105 12: Delete(Root^.RPtr,X,Found) 13: ELSE 14: BEGIN {kasus 4: pencarian ketemu, melakukan delete node} 15: Found := True; {kasus 4a: merupakan leaf} 16: IF (Root^.LPtr = NIL) AND (Root^.RPtr = NIL) THEN 17: BEGIN 18: Root := NIL; 19: Dispose(Root); 20: END 21: ELSE {kasus 4b: tidak mempunyai subtree kanan} 22: IF Root^.RPtr = NIL THEN 23: BEGIN 24: P := Root; 25: Root := Root^.LPtr; 26: Dispose(P); 27: END 28: ELSE {kasus 4c: mempunyai subtree kanan} 29: BEGIN {mencari inorder successor} 30: P := Root^.RPtr; 31: WHILE P^.LPtr <> NIL DO 32: P := P^.LPtr; 33: Root^.Info := P^.Info; {menghapus inorder successor} 34: Delete(Root^.RPtr,P,Found); 35: END; 36: END; 37: END; Program 11.5 Procedure Delete Suatu Node (Lanjutan) 11.4 Copy Tree Operasi terakhir yang dibahas adalah operasi penggandaan (copy) sebuah binary tree. Operasi copy ini terutama berguna bila akan dilakukan suatu operasi yang akan menghancurkan atau mengubah tree tersebut, sehingga perlu dibuat duplikatnya. Berikut ini diberikan algoritma umum yang menjalankan proses penggandaan sebuah binary tree secara rekursif. 1. Jika tree kosong, maka kembalikanlah nilai nil. 2. Membuat node baru dan menyalin informasi dari node yang akan digandakan.

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 106 3. Menyalinkan subtree kiri dan kanan dari node yang akan digandakan ke subtree kiri dan kanan dari node baru (secara rekursif). 4. Mengembalikan alamat dari node baru. 1: FUNCTION Copy_BinTree(T: BinTreeType): BinTreeType; {Menyalinkan binary tree T ke binary tree baru dan mengembalikan alamatnya} 2: VAR 3: NewNode: BinTreeType; 4: BEGIN {langkah 1: check apakah empty tree} 5: IF T = NIL THEN 6: Copy_BinTree := NIL 7: ELSE 8: BEGIN {langkah 2: membuat node baru dan menyalin informasi node} 9: New(NewNode); 10: NewNode^.Info := T^.Info; {langkah 3: menyalinkan subtree kiri dan kanan} 11: NewNode^.LPtr := Copy_BinTree(T^.LPtr); 12: NewNode^.RPtr := Copy_BinTree(T^.RPtr); {langkah 4: mengembalikan alamat node baru} 13: Copy_BinTree := NewNode; 14: END; 15: END; Program 11.6 Procedure Untuk Menggandakan Suatu Binary Tree 11.5 Latihan Soal 1. Buatlah sebuah function untuk membandingkan dua buah binary tree yang akan mengembalikan nilai true jika sama dan false jika tidak sama. 2. Buatlah sebuah procedure yang melakukan searching node pada binary tree secara iteratif. 3. Buatlah sebuah procedure untuk mencari node predecessor secara inorder dari sebuah node pada binary tree. 4. Buatlah sebuah procedure untuk membalik sebuah binary tree, child kiri menjadi child kanan dan sebaliknya. 5. Buatlah sebuah procedure untuk menghapus semua node pada level tertentu dari sebuah binary tree. Catatan: Nomor level merupakan parameter input. 6. Ada sebuah metode lain untuk menghapus sebuah node pada suatu binary tree. Pada setiap node mempunyai sebuah flag yang akan diset true jika dinyatakan

www.hansmichael.com - Bab XI. Manipulasi Binary Tree 107 dihapus. Jadi, proses menghapus sebuah node yaitu mengganti flag dari node tersebut menjadi true. Jika ternyata jumlah node yang flagnya diset true lebih dari 50%, maka perlu diorganisasi ulang. a) Buatlah sebuah function Test untuk menguji apakah binary tree tersebut telah melampaui batas maksimum dari jumlah node yang flagnya diset true. b) Buatlah sebuah procedure Reorganize untuk melakukan organisasi ulang yang akan menghapus secara fisik semua node yang flagnya diset true. Catatan: tidak boleh membentuk node baru.