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================");
}
}