Minggu, 18 April 2010

Java pohonner

class Simpul{
char info;
Simpul sibling;
Simpul child;

Simpul(){
}
}

class Tree{
Simpul root;

Tree(){
}


/*--------------------------*/

void makeTree(char c){


Simpul node;
node = new Simpul();

node.info = c;
node.sibling = null;
node.child = null;
root = node;

}

/*--------------------------*/

void addChild(char c, Simpul root){


if(root != null){
/*jika root tidak kosong*/
Simpul node;
node = new Simpul();

node.info = c;
node.child = null;

if(root.child == null){
/*simpul baru menjadi anak pertama*/
node.sibling = null;
root.child = node;
}
else{
if(root.child.sibling == null){
/*jika simpul baru menjadi anak kedua*/
node.sibling = root.child;
root.child.sibling = node;
}
else{
Simpul last = root.child;

/*mencari simpul anak terakhir*/
while(last.sibling != root.child){
last = last.sibling;
}

node.sibling = root.child;
last.sibling = node;

}
}
}
}

/*--------------------------*/

void delChild(char c, Simpul root){


Simpul node = root.child;

if(node != null){
if(node.sibling == null){
/*jika hanya mempunyai satu anak*/
if(root.child.info == c){
root.child = null;

}
else{
System.out.println("tidak ada simpul anak dengan info karakter masukan");
}
}
else{
/*jika memiliki banyak anak*/
Simpul prec = null;

/*mencari simpul yang akan dihapus*/
boolean ketemu = false;
while((node.sibling != root.child) && (ketemu == false)){
if(node.info == c){
ketemu = true;
}
else{
prec = node;
node = node.sibling;
}
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
if((ketemu == false) && (node.info == c)){
ketemu = true;
}

if(ketemu == true){
Simpul last = root.child;

/*mencari simpul anak terakhir*/
while(last.sibling != root.child){
last = last.sibling;
}

if(prec == null){
/*jika simpul yang dihapus anak pertama*/
if((node.sibling == last) && (last.sibling == root.child)){

/*jika hanya ada 2 anak*/
root.child = last;
last.sibling = null;
}
else{
root.child = node.sibling;
last.sibling = root.child;
}
}
else{
if((prec == root.child) && (last.sibling == root.child)){

/*jika hanya ada 2 simpul anak, yang dihapus anak kedua*/
root.child.sibling = null;
}
else{
prec.sibling = node.sibling;
node.sibling = null;
}
}


}
else{
System.out.println("tidak ada simpul anak dengan info karakter masukan");
}
}
}

}

/*--------------------------*/

Simpul findSimpul(char c, Simpul root){

Simpul hasil = null;

if(root != null){
if(root.info == c){
hasil = root;
}
else{

Simpul node = root.child;

if(node != null){
if(node.sibling == null){
/*jika hanya memiliki satu anak*/
if(node.info == c){
hasil = node;
}
else{
hasil = findSimpul(c, node);
}
}
else{
/*jika memiliki banyak anak*/
boolean ketemu = false;
while((node.sibling != root.child) && (ketemu == false)){

if(node.info == c){
hasil = node;
ketemu = true;
}
else{
hasil = findSimpul(c, node);
node = node.sibling;
}
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
if(ketemu == false){
if(node.info == c){
hasil = node;
}
else{
hasil = findSimpul(c, node);
}
}
}
}
}
}

return hasil;

}

/*--------------------------*/

void printTreePreOrder(Simpul root){

if(root != null){
System.out.print(" " + root.info + " ");
Simpul node = root.child;

if(node != null){
if(node.sibling == null){
/*jika memiliki satu anak*/
printTreePreOrder(node);
}
else{
/*jika memiliki banyak anak*/

/*mencetak simpul anak*/
while(node.sibling != root.child){
printTreePreOrder(node);
node = node.sibling;
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
printTreePreOrder(node);
}
}
}

}

/*--------------------------*/

void printTreePostOrder(Simpul root){


if(root != null){

Simpul node = root.child;

if(node != null){
if(node.sibling == null){
/*jika memiliki satu anak*/
printTreePostOrder(node);
}
else{
/*jika memiliki banyak anak*/

/*mencetak simpul anak*/
while(node.sibling != root.child){
printTreePostOrder(node);
node = node.sibling;
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
printTreePostOrder(node);
}
}

System.out.print(" " + root.info + " ");
}

}

/*--------------------------*/

void printTreeLevelOrderNext(Simpul root){


if(root != null){

Simpul node = root.child;

if(node != null){
if(node.sibling == null){
/*jika memiliki satu anak*/
System.out.print(" " + node.info + " ");
printTreeLevelOrderNext(node);
}
else{
while(node.sibling != root.child){
System.out.print(" " + node.info + " ");
node = node.sibling;
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
System.out.print(" " + node.info + " ");
node = root.child;

while(node.sibling != root.child){
printTreeLevelOrderNext(node);
node = node.sibling;
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/

printTreeLevelOrderNext(node);

}
}

}

}

void printTreeLevelOrder(Simpul root){

if(root != null){
System.out.print(" " + root.info + " ");
printTreeLevelOrderNext(root);
}

}

/*--------------------------*/

void copyTree(Simpul root1, Simpul root2){

if(root != null){
root2 = new Simpul();

root2.info = root1.info;
root2.sibling = null;
root2.child = null;

if(root.child != null){
if(root.child.sibling == null){
/*jika memiliki satu anak*/
copyTree(root1.child, root2.child);
}
else{
/*jika memiliki banyak anak*/
Simpul node1 = root1.child;
Simpul node2 = root2.child;

while(node1.sibling != root.child){
copyTree(node1, node2);
node1 = node1.sibling;
node2 = node2.sibling;
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
copyTree(node1, node2);

}

}

}

}

/*--------------------------*/

boolean isEqual(Simpul root1, Simpul root2){

boolean hasil = true;

if((root1 != null) && (root2 != null)){
if(root1.info != root2.info){
hasil = false;
}
else{
if((root.child != null) && (root2.child != null)){
if(root.child.sibling == null){
/*jika memiliki satu anak*/
hasil = isEqual(root.child, root.child);
}
else{
/*jika memiliki banyak anak*/
Simpul node1 = root1.child;
Simpul node2 = root2.child;

while(node1.sibling != root.child){

if((node1 != null) && (node2 != null)){
hasil = isEqual(node1, node2);
node1 = node1.sibling;
node2 = node2.sibling;
}
else{
hasil = false;
break;
}
}

/*memproses simpul anak terakhir karena belum terproses dalam perulangan*/
hasil = isEqual(node1, node2);
}
}
}
}
else{
if((root1 != null) || (root2 != null)){
hasil = false;
}
}

return hasil;

}

/*--------------------------*/
}

/*--------------------------*/

class CobaPohonNEr{

public static void main(String[] args) {
Tree T = new Tree();

T.makeTree('A');
T.addChild('B', T.root);
T.addChild('C', T.root);
T.addChild('D', T.root);

Simpul node = T.findSimpul('B', T.root);
if(node != null){
T.addChild('E', node);
T.addChild('F', node);
}

node = T.findSimpul('C', T.root);
if(node != null){
T.addChild('G', node);
}

node = T.findSimpul('D', T.root);
if(node != null){
T.addChild('H', node);
T.addChild('I', node);
T.addChild('J', node);
}

node = T.findSimpul('J', T.root);
if(node != null){
T.addChild('K', node);
T.addChild('L', node);
T.addChild('M', node);
}
System.out.println("================");
System.out.println("preOrder");
T.printTreePreOrder(T.root);
System.out.println("\n================");
System.out.println("postOrder");
T.printTreePostOrder(T.root);
System.out.println("\n================");
System.out.println("levelOrder");
T.printTreeLevelOrder(T.root);
System.out.println("\n================");

Tree T2 = new Tree();

T2.copyTree(T.root, T2.root);
if(T.isEqual(T.root, T2.root) == true){
System.out.println("pohon sama");
}
else{
System.out.println("pohon tidak sama");
}

node = T.findSimpul('J', T.root);
if(node != null){
T.delChild('K', node);
T.delChild('L', node);
T.delChild('M', node);
}

System.out.println("================");
System.out.println("preOrder setelah dihapus");
T.printTreePreOrder(T.root);
System.out.println("\n================");
}
}