/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package treestring;
public class TreeString {
class node{
String data;
node left;
node right;
node(String x){
this.data=x;
}
}
private node akar;
private boolean iskosong(){
return (akar == null);
}
private static int treeCount=0;
public static void addCounter(){
treeCount+=1;
}
public static void decreaseCounter(){
treeCount-=1;
}
public static int getRecordCount(){
return treeCount;
}
public void insert(String input){
node baru = new node(input);
TreeString.addCounter();
if(iskosong())
akar = baru;
else {
node cursor=akar,
parent=null;
while (cursor!=null){
parent = cursor;
if(input.compareTo(cursor.data)<0)
cursor = cursor.left;
else
cursor = cursor.right;
}if(input.compareTo(parent.data)<0){
parent.left=baru;
return;
}else{
parent.right=baru;
return;
}
}
}
public boolean find(String target){
node cursor=akar;
boolean ketemu=false;
while (cursor!=null){
if(cursor.data.equals(target)){
ketemu=true;
System.out.println("Data Ditemukan\n");
break;
}else if(target.compareTo(cursor.data)<0)
cursor=cursor.left;
else
cursor=cursor.right;
}return ketemu;
}
public void preorder (node root){
if(root==null)return;
System.out.print(root.data+" ");
preorder(root.left);
preorder(root.right);
}
private void inorder(node dakar){
if(dakar==null)return;
inorder(dakar.left);
System.out.print(dakar.data+" ");
inorder(dakar.right);
}
private void postorder(node dakar){
if(dakar == null)return;
postorder(dakar.left);
postorder(dakar.right);
System.out.print(dakar.data+" ");
}
public void delete(String target){
node x; node cursor;
node y; node parent;
if(!find(target))
System.out.print("Data Tidak ada!! \n");
else{
TreeString.decreaseCounter();
cursor=akar;
parent=null;
while(cursor!=null){
parent=cursor;
if(target.compareTo(cursor.data)<0){
cursor=cursor.left;
if(cursor.data.equals(target))break;
}else if(target.compareTo(cursor.data)>0 ){
cursor=cursor.right;
if(cursor.data.equals(target))break;
}else if(target.equals(cursor.data)){
break;/*untuk metode hapus akar*/
}//jika target ada pada cursor==akar
}//untuk cursor.data== target==akar.data
if(cursor==akar){
if(cursor.right==null)
akar=akar.left;
else
if((cursor.right==null)&&(cursor.left==null))
akar=null;
else { //kalau akar.right ada dan (akar.left bisa ada atau sama dengan null)
x=cursor.right;
//y=cursor.right;
while(x.left!=null)
x.left=cursor.left;
akar=akar.right;
}
}
//untuk yg cursor !=akar
else{
if((cursor.left==null)&&(cursor.right==null)){//kalau yg ditemukan ada di child paling bawah
if(target.compareTo(parent.data)<0)
parent.left=null;
else parent.right=null;
}else
if((cursor.right!=null)&&((cursor.left!=null)||(cursor.left==null))){
x=cursor.right;
y=cursor.right;
while(x.left!=null)
x=x.left;
x.left=cursor.left;
if(y.data.compareTo(parent.data)<0)parent.left=y;
else parent.right=y;
}else
if((cursor.right==null)&&(cursor.left!=null)){
x=cursor.left;
if(x.data.compareTo(parent.data)<0)parent.left=x;
else parent.right=x;
}
}//lokasi data dihapus tidak di posisi akar
}
}
/*
* Method traverse untuk mengelilingi node-node dalam tree
*/
public void traverse(int tipe){
switch(tipe){
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("\n");
}