import java.io.*;
import java.util.*;
class Node
{
public int bilBulat;
public double bilPecah;
public Node anakKiri;
public Node anakKanan;
public void displayNode()
{
System.out.print('{');
System.out.print(bilBulat);
System.out.print(", ");
System.out.print(bilPecah);
System.out.print("} ");
}
}
class Pohon
{
private Node akar;
public Pohon()
{ akar = null; }
public Node cari(int kunci)
{
Node lihat = akar;
while(lihat.bilBulat != kunci)
{
if(kunci < lihat.bilBulat)
lihat = lihat.anakKiri;
else
lihat=lihat.anakKanan;
if(lihat == null)
return null;
}
return lihat;
}
public void tambah(int dataBulat, double dataPecah)
{
Node nodeBaru = new Node();
nodeBaru.bilBulat = dataBulat;
nodeBaru.bilPecah = dataPecah;
if(akar == null)
akar = nodeBaru;
else
{
Node lihat = akar;
Node induk;
while(true)
{
induk=lihat;
if(dataBulat < lihat.bilBulat)
{
lihat = lihat.anakKiri;
if(lihat == null)
{
induk.anakKiri = nodeBaru;
return;
}
}
else
{
lihat = lihat.anakKanan;
if(lihat == null)
{
induk.anakKanan = nodeBaru;
return;
}
}
}
}
}
public boolean hapus(int kunci)
{
Node lihat = akar;
Node induk = akar;
boolean isAnakKiri = true;
while(lihat.bilBulat != kunci)
{
induk = lihat;
if(kunci < lihat.bilBulat)
{
isAnakKiri = true;
lihat = lihat.anakKiri;
}
else
{
isAnakKiri = false;
lihat = lihat.anakKanan;
}
if(lihat == null)
return false;
}
if(lihat.anakKiri==null &&
lihat.anakKanan==null)
{
if(lihat == akar)
akar = null;
else if(isAnakKiri)
induk.anakKiri = null;
else
induk.anakKanan = null;
}
else if(lihat.anakKanan==null)
if(lihat == akar)
akar = lihat.anakKiri;
else if(isAnakKiri)
induk.anakKiri = lihat.anakKiri;
else
induk.anakKanan = lihat.anakKiri;
else if(lihat.anakKiri==null)
if(lihat == akar)
akar = lihat.anakKanan;
else if(isAnakKiri)
induk.anakKiri = lihat.anakKanan;
else
induk.anakKanan = lihat.anakKanan;
else
{
Node successor = getSuccessor(lihat);
if(lihat == akar)
akar = successor;
else if(isAnakKiri)
induk.anakKiri = successor;
else
induk.anakKanan = successor;
successor.anakKiri = lihat.anakKiri;
}
return true;
}
private Node getSuccessor(Node hapusNode)
{
Node successorInduk = hapusNode;
Node successor = hapusNode;
Node lihat = hapusNode.anakKanan;
while(lihat != null)
{
successorInduk = successor;
successor = lihat;
lihat = lihat.anakKiri;
}
if(successor != hapusNode.anakKanan)
{
successorInduk.anakKiri = successor.anakKanan;
successor.anakKanan = hapusNode.anakKanan;
}
return successor;
}
public void traverse(int traverseType)
{
switch(traverseType)
{
case 1: System.out.print("\nPreorder traversal: ");
preOrder(akar);
break;
case 2: System.out.print("\nInorder traversal: ");
inOrder(akar);
break;
case 3: System.out.print("\npostorder traversal: ");
postOrder(akar);
break;
}
System.out.println();
}
private void preOrder(Node subAkar)
{
if(subAkar != null)
{
System.out.print(subAkar.bilBulat + " ");
preOrder(subAkar.anakKiri);
preOrder(subAkar.anakKanan);
}
}
private void inOrder(Node subAkar)
{
if(subAkar != null)
{
inOrder(subAkar.anakKiri);
System.out.print(subAkar.bilBulat + " ");
inOrder(subAkar.anakKanan);
}
}
private void postOrder(Node subAkar)
{
if(subAkar != null)
{
postOrder(subAkar.anakKiri);
postOrder(subAkar.anakKanan);
System.out.print(subAkar.bilBulat + " ");
}
}
public void displayPohon()
{
Stack semuaTumpukan = new Stack();
semuaTumpukan.push(akar);
int jmlKosong = 32;
boolean isBarisKosong = false;
System.out.println("....................................................");
while(isBarisKosong==false)
{
Stack subTumpukan = new Stack();
isBarisKosong = true;
for(int j=0; j<jmlKosong; j++)
System.out.print(' ');
while(semuaTumpukan.isEmpty()==false)
{
Node temp = (Node)semuaTumpukan.pop();
if(temp != null)
{
System.out.print(temp.bilBulat);
subTumpukan.push(temp.anakKiri);
subTumpukan.push(temp.anakKanan);
if(temp.anakKiri != null ||
temp.anakKanan != null)
isBarisKosong = false;
}
else
{
System.out.print("--");
subTumpukan.push(null);
subTumpukan.push(null);
}
for(int j=0; j<jmlKosong*2-2; j++)
System.out.print(' ');
}
System.out.println();
jmlKosong /= 2;
while(subTumpukan.isEmpty()==false)
semuaTumpukan.push(subTumpukan.pop() );
}
System.out.println(".............................................");
}
}
class ApliPohon
{
public static void main(String[] args)
throws IOException
{
int nilai;
Pohon pohonBaru = new Pohon();
pohonBaru.tambah(50, 1.5);
pohonBaru.tambah(25, 1.2);
pohonBaru.tambah(75, 1.7);
pohonBaru.tambah(12, 1.5);
pohonBaru.tambah(37, 1.2);
pohonBaru.tambah(43, 1.7);
pohonBaru.tambah(30, 1.5);
pohonBaru.tambah(33, 1.2);
pohonBaru.tambah(87, 1.7);
pohonBaru.tambah(93, 1.5);
pohonBaru.tambah(97, 1.5);
while(true)
{
System.out.print("Ketik huruf pertama, ");
System.out.print("lihat, tambah, cari, hapus, atau kunjungan: ");
int pilih = getChar();
switch(pilih)
{
case 'l':
pohonBaru.displayPohon();
break;
case 't':
System.out.print("Masukkan nilai untuk tambah: ");
nilai = getInt();
pohonBaru.tambah(nilai, nilai + 0.9);
break;
case 'c':
System.out.print("Masukkan nilai to cari: ");
nilai = getInt();
Node hasil = pohonBaru.cari(nilai);
if(hasil != null)
{
System.out.print("Diperoleh : ");
hasil.displayNode();
System.out.print("\n");
}
else
System.out.print("Tidak bisa ditemukan ");
System.out.print(nilai + '\n');
break;
case 'h':
System.out.print("Masukkan nilai untuk dihapus: ");
nilai = getInt();
boolean didDelete = pohonBaru.hapus(nilai);
if(didDelete)
System.out.print("Dihapus " + nilai + '\n');
else
System.out.print("Tidak bisa dihapus ");
System.out.print(nilai + '\n');
break;
case 'k':
System.out.print("Masukkan angka 1, 2 atau 3: ");
nilai = getInt();
pohonBaru.traverse(nilai);
break;
default:
System.out.print("Salah memasukkan huruf \n");
}
}
}
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);
}
}
No comments:
Post a Comment