7 Praktikum (Binary Tree)
7 Praktikum (Binary Tree)
LABORATORIUM PEMROGRAMAN PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS MUHAMMADIYAH MALANG 2011
I. TUJUAN
Mahasiswa mampu : 1. Memahami struktur data binary tree 2. Menerapkan binary tree dalam pemrograman 3. Memahami struktur data binary search tree dan operasi-operasinya 4. Menerapkan binary search tree dan operasi-operasinya dalam pemrograman 5. Memahami algoritma transversal pada pohon biner 6. Menerapkan transversal pohon biner dalam pemrograman
V. LATIHAN
Petunjuk : Cobalah contoh program yang ada pada latihan di bawah ini di laboratorium. Mintalah bimbingan kepada asisten/dosen jika ada kesulitan. Analisa program tersebut untuk dapat mengerjakan tugas praktikum dengan mudah.
/** test program */ public static void main(String [] args) { Integer [] a = new Integer [15]; a[1] = new Integer(1); a[2] = new Integer(2); a[5] = new Integer(5); a[10] = new Integer(10); a[11] = new Integer(11); System.out.println("The elements in inorder are"); inOrder(a, 11); System.out.println(); } }
Output Program:
if(id < current.iData) // go left? { current = current.leftChild; if(current == null) // if end of the line, { // insert on left parent.leftChild = newNode; return; } } // end if go left else // or go right? { current = current.rightChild; if(current == null) // if end of the line { // insert on right parent.rightChild = newNode; return; } } // end else go right } // end while } // end else not root } // end insert() // ------------------------------------------------------------public boolean delete(int key) // delete node with given key { // (assumes non-empty list) Node current = root; Node parent = root; boolean isLeftChild = true; while(current.iData != key) // { parent = current; if(key < current.iData) // { isLeftChild = true; current = current.leftChild; } else // { isLeftChild = false; current = current.rightChild; } if(current == null) // return false; // } // end while // found node to delete search for node go left?
or go right?
// if no children, simply delete it if(current.leftChild==null && current.rightChild==null) { if(current == root) // if root, root = null; // tree is empty else if(isLeftChild) parent.leftChild = null; // disconnect else // from parent parent.rightChild = null; }
// if no right child, replace with left subtree else if(current.rightChild==null) if(current == root) root = current.leftChild; else if(isLeftChild) parent.leftChild = current.leftChild; else parent.rightChild = current.leftChild; // if no left child, replace with right subtree else if(current.leftChild==null) if(current == root) root = current.rightChild; else if(isLeftChild) parent.leftChild = current.rightChild; else parent.rightChild = current.rightChild; else // two children, so replace with inorder successor { // get successor of node to delete (current) Node successor = getSuccessor(current); // connect parent of current to successor instead if(current == root) root = successor; else if(isLeftChild) parent.leftChild = successor; else parent.rightChild = successor; // connect successor to current's left child successor.leftChild = current.leftChild; } // end else two children // (successor cannot have a left child) return true; // success } // end delete() // ------------------------------------------------------------// returns node with next-highest value after delNode // goes to right child, then right child's left descendents private Node getSuccessor(Node delNode) { Node successorParent = delNode; Node successor = delNode; Node current = delNode.rightChild; // go to right child while(current != null) // until no more { // left children, successorParent = successor; successor = current; current = current.leftChild; // go to left child } // if successor not if(successor != delNode.rightChild) // right child, { // make connections successorParent.leftChild = successor.rightChild; successor.rightChild = delNode.rightChild; } return successor;
} // ------------------------------------------------------------public void traverse(int traverseType) { switch(traverseType) { case 1: System.out.print("\nPreorder traversal: "); preOrder(root); break; case 2: System.out.print("\nInorder traversal: "); inOrder(root); break; case 3: System.out.print("\nPostorder traversal: "); postOrder(root); break; } System.out.println(); } // ------------------------------------------------------------private void preOrder(Node localRoot) { if(localRoot != null) { System.out.print(localRoot.iData + " "); preOrder(localRoot.leftChild); preOrder(localRoot.rightChild); } } // ------------------------------------------------------------private void inOrder(Node localRoot) { if(localRoot != null) { inOrder(localRoot.leftChild); System.out.print(localRoot.iData + " "); inOrder(localRoot.rightChild); } } // ------------------------------------------------------------private void postOrder(Node localRoot) { if(localRoot != null) { postOrder(localRoot.leftChild); postOrder(localRoot.rightChild); System.out.print(localRoot.iData + " "); } } // ------------------------------------------------------------public void displayTree() { Stack globalStack = new Stack(); globalStack.push(root); int nBlanks = 32; boolean isRowEmpty = false; System.out.println( "......................................................"); while(isRowEmpty==false)
{ Stack localStack = new Stack(); isRowEmpty = true; for(int j=0; j<nBlanks; j++) System.out.print(' '); while(globalStack.isEmpty()==false) { Node temp = (Node)globalStack.pop(); if(temp != null) { System.out.print(temp.iData); localStack.push(temp.leftChild); localStack.push(temp.rightChild); if(temp.leftChild != null || temp.rightChild != null) isRowEmpty = false; } else { System.out.print("--"); localStack.push(null); localStack.push(null); } for(int j=0; j<nBlanks*2-2; j++) System.out.print(' '); } // end while globalStack not empty System.out.println(); nBlanks /= 2; while(localStack.isEmpty()==false) globalStack.push( localStack.pop() ); } // end while isRowEmpty is false System.out.println( "......................................................"); } // end displayTree() // ------------------------------------------------------------} // end class Tree //////////////////////////////////////////////////////////////// class TreeApp { public static void main(String[] args) throws IOException { int value; Tree theTree = new Tree(); theTree.insert(50, theTree.insert(25, theTree.insert(75, theTree.insert(12, theTree.insert(37, theTree.insert(43, theTree.insert(30, theTree.insert(33, theTree.insert(87, theTree.insert(93, theTree.insert(97, 1.5); 1.2); 1.7); 1.5); 1.2); 1.7); 1.5); 1.2); 1.7); 1.5); 1.5);
while(true) { System.out.print("Enter first letter of show, "); System.out.print("insert, find, delete, or traverse: "); int choice = getChar(); switch(choice) { case 's': theTree.displayTree(); break; case 'i': System.out.print("Enter value to insert: "); value = getInt(); theTree.insert(value, value + 0.9); break; case 'f': System.out.print("Enter value to find: "); value = getInt(); Node found = theTree.find(value); if(found != null) { System.out.print("Found: "); found.displayNode(); System.out.print("\n"); } else System.out.print("Could not find "); System.out.print(value + '\n'); break; case 'd': System.out.print("Enter value to delete: "); value = getInt(); boolean didDelete = theTree.delete(value); if(didDelete) System.out.print("Deleted " + value + '\n'); else System.out.print("Could not delete "); System.out.print(value + '\n'); break; case 't': System.out.print("Enter type 1, 2 or 3: "); value = getInt(); theTree.traverse(value); break; default: System.out.print("Invalid entry\n"); } // end switch } // end while } // end main() // ------------------------------------------------------------public static String getString() throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); return s; }
// ------------------------------------------------------------public static char getChar() throws IOException { String s = getString(); return s.charAt(0); } //------------------------------------------------------------public static int getInt() throws IOException { String s = getString(); return Integer.parseInt(s); } // ------------------------------------------------------------} // end class TreeApp ////////////////////////////////////////////////////////////////
Output program:
VIII. KESIMPULAN
[Kesimpulan tidak boleh sama antar mahasiswa, meskipun dalam 1 kelompok] TUGAS AKHIR PRAKTIKUM: Mengumpulkan portofolio laporan praktikum ASD dengan format sebagi berikut: Cover Kata Pengantar Daftar Isi Laporan Praktikum 1 Laporan Praktikum 2 Laporan Praktikum 3 Laporan Praktikum 4 Laporan Tugas Pengganti modul 5 & 6 Laporan Praktikum 7 Penutup (berisi kesimpulan secara umum dan saran) Dikumpulkan sesuai dengan kelompoknya masing-masing dalam bentuk CD yang berisi portofolio laporan dan sourcecode program. Dikumpulkan pada minggu terakhir sebelum UAS sesuai dengan jadwal praktikum.