Praktikum Algoritma dan Setruktur Data “AVL Tree”
Oleh:
Sukarjo (115090613111001) Asisten:
Dwi Saputro Ilham Yuliantoro
PROGRAM TEKNOLOGI INFORMATIKA DAN ILMU KOMPUTER UNIVERSITAS BRAWIJAYA MALANG - 2012
Pendahuluan AVL Tree. Dalam sebuah AVL Tree, yang ketinggian dari dua anak sub pohon dari simpul apapun berbeda dengan paling banyak satu, jika sewaktuwaktu mereka berbeda lebih dari satu maka rebalancing dilakukan untuk mengembalikan properti ini dengan cara memutar dari setruktur bilangan Tree tersebut atau dengan Lookup, penyisipan, dan penghapusan.
Sourcode
package praktikum9; import java.util.*; class Node { Object data; int tinggi; Node pKiri; Node pKanan; Node pInduk; public Node(Object dt, int tg,Node this.data=dt; this.tinggi=tg; this.pKiri=pKi; this.pKanan=pKa; this.pInduk=pI; }
pKi, Node
pKa, Node
pI){
} public class AVLT { private Node root; public AVLT(){root=null;} public boolean cariDt(Object dt){ Node temp = root; while(temp!=null){ if(dt==temp.data)return true; else if(dt.hashCode()
root= new Node(dt,1,null,null,null); return true; }else{ Node temp=root; Node prev= null; while(temp!=null){ if(dt.equals(temp.data))return false; else if (dt.hashCode()
=2&&(tinggi(temp.pKiri))>=tinggi(temp.pKanan)){ Node parent= temp.pInduk; Node pKiri=temp.pKiri; temp.pKiri=temp.pKanan; if(temp.pKiri!=null)temp.pKiri.pInduk=temp; pKiri.pKanan=temp; temp.pInduk=pKiri; pKiri.pInduk=parent; if(parent==null)root=pKiri; else if (parent.pKiri==temp)parent.pKiri=pKiri; else parent.pKanan=pKiri;
temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan))+1; } else if(tinggi(temp.pKanan)tinggi(temp.pKiri)>=2&&tinggi(temp.pKanan)>=tinggi(temp.pKiri)){ Node parent= temp.pInduk; Node pKanan=temp.pKanan; temp.pKanan=pKanan.pKiri; if(temp.pKanan!=null)temp.pKanan.pInduk=temp; pKanan.pKiri=temp; temp.pKanan=temp.pKanan; pKanan.pKiri=temp; temp.pInduk=pKanan; pKanan.pInduk=parent; if(parent==null)root=pKanan; else if(parent.pKanan==temp)parent.pKanan=pKanan; else parent.pKiri=pKanan; //menghitung tinggi subtree pKanan temp.tinggi =Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); temp= pKanan; //menghitung tinggi dari root temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); } else if(tinggi(temp.pKiri)tinggi(temp.pKanan)>=2&& tinggi(temp.pKiri.pKanan)>=tinggi(temp.pKiri.pKiri)){ Node parent = temp.pInduk; Node pKiripKanan = temp.pKiri.pKanan;
if(temp.pKiri.pKanan!=null) temp.pKiri.pKanan=temp.pKiri; pKiripKanan.pKanan=temp; temp.pInduk=pKiripKanan; pKiripKanan.pInduk=parent; if(parent==null)root=pKiripKanan; else if(parent.pKiri==temp) parent.pKiri=pKiripKanan; else parent.pKanan=pKiripKanan; //hitung tinggi subtree kanan temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); temp =pKiripKanan; //hitung tinggi dari root temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); } else if(tinggi(temp.pKanan)tinggi(temp.pKiri)>=2&& tinggi(temp.pKanan.pKiri)>=tinggi(temp.pKanan.pKanan)){ Node parent = temp.pInduk; Node pKananpKiri = temp.pKanan.pKiri; temp.pKanan.pKiri=pKananpKiri.pKanan; if(temp.pKanan.pKiri!=null) temp.pKanan.pKiri.pInduk=temp.pKanan; pKananpKiri.pKanan=temp.pKanan; temp.pKanan.pInduk=pKananpKiri; temp.pKanan=pKananpKiri.pKiri; if(temp.pKanan!=null) temp.pKanan.pInduk=temp;
pKananpKiri.pKiri=temp; temp.pInduk=pKananpKiri; pKananpKiri.pInduk=parent; if(parent==null)root=pKananpKiri; else if(parent.pKanan==temp) parent.pKanan=pKananpKiri; else parent.pKiri=pKananpKiri; temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); temp=pKananpKiri; temp.tinggi=Math.max(tinggi(temp.pKiri),tinggi(temp.pKanan)+1); } temp=temp.pInduk; } //penyisipan berhasil return true; } } //menghitung node-node dari tree public int jumlahNode(){ return jumlahNode(root); } private int jumlahNode(Node node){ if(node==null)return 0; else return 1+jumlahNode(node.pKiri)+jumlahNode(node.pKanan); } public void inOrderTranversal(){ inOrder(root); } private void inOrder(Node node){ if(node==null)return; inOrder(node.pKiri); System.out.printf("-"+node.data); inOrder(node.pKanan); } public String User(String nama) { Scanner input=new Scanner(System.in);
System.out.print("ID\t: "); int id=input.nextInt(); System.out.print("Alamat\t: "); String alamat=input.next(); String data=id+"\t\t"+nama+"\t\t"+alamat+"\n"; return data; } public static void main(String[] args){ Scanner input =new Scanner(System.in); AVLT tree = new AVLT(); System.out.println("SUSUNAN TREE"); System.out.println("============"); tree.sisipDt(3);tree.inOrderTranversal();System.out.println(); tree.sisipDt(4);tree.inOrderTranversal();System.out.println(); tree.sisipDt(6);tree.inOrderTranversal();System.out.println(); tree.sisipDt(5);tree.inOrderTranversal();System.out.println(); tree.sisipDt(15);tree.inOrderTranversal();System.out.println(); tree.sisipDt(10);tree.inOrderTranversal();System.out.println(); tree.sisipDt(20);tree.inOrderTranversal();System.out.println(); tree.sisipDt(17);tree.inOrderTranversal();System.out.println(); tree.sisipDt(25);tree.inOrderTranversal();System.out.println(); AVLT av = new AVLT(); boolean selesai=false;String sel=""; System.out.println("\nSELAMAT DATANG !"); System.out.println("================"); System.out.println("\nsilahkan isi data diri anda\n"); System.out.println("______________________________\n"); while(selesai!=true) { System.out.print("\nNama\t: "); String nama=input.nextLine(); av.sisipDt((new String(av.User(nama))));System.out.println("\nNasabah terdaftar saat ini\n");
av.inOrderTranversal();System.out.println(); System.out.print("Apakah Anda Ingin Melanjutkan ?\n"); System.out.println("_____________________________\n"); System.out.println("(y) untuk MELANJUTKAN"); System.out.println("(t) untuk TIDAK"); sel=input.nextLine(); if(sel.equalsIgnoreCase("t"))selesai= true; } } }
Output
Analisa public Node(Object dt, int tg,Node pKi, Node pKa, Node pI) ini digunakan untuk menginisialisasikan dari method dt, tinggi node, node kiri, kanan dan induk. public class AVLT {ini ialah class dengan nama AVT private Node root; ini ialah method root dari Tree public AVLT(){root=null;} ini ialah untuk mengambil nilai dari root private int tinggi(Node node) ini ialah methot untuk mengambil nilai tinggi dari root public boolean sisipDt(Object dt) ini ialah method untuk memasukan nilai dari tree public int jumlahNode() ini ialah untuk mencari jumlah dari tree. public void inOrderTranversal() ini ialah untuk mencari nilai Tree yang telah di inorder. public String User(String nama) ini method untukmenampung data id, dan alamat dari user. public static void main(String[] args) ini ialah methot utama atau main method dari program.
Kesimpulan Dari pembahasan laporan di atas maka dapat disimpulkan bahwa : Binary Search Tree AVL ialah algoritma yang akan membandingkan sebuah nilai dan kaki(root) dari Tree tersebut. AVL ini tidak boleh memiliki panjang lebih dari 2. Jika hal ini terjadi maka pembandingan (balance) akan di lakukan dengan system pemutaran sehingga ditemukan nilai < 2.
Daftar Pustaka en.wikipedia.org/wiki/AVL_tree Modul praktikum Algoritma dan Setruktur Data 1