Saturday 13 April 2013

Java Node

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