package algodataufg04_j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)  throws IOException  {
        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
        BinST tree = new BinST();
        String in = null;
        int key;
        tree.root = null;
        tree.insert(200);
        tree.insert(100);
        tree.insert(300);
        tree.insert(50);
        tree.insert(150);
        /*tree.insert(79);
        tree.insert(27);
        tree.insert(15);
        tree.insert(30);
        /*tree.insert(30);
        tree.insert(50);
        tree.insert(20);
        tree.insert(25);
        tree.insert(22);
        tree.insert(27);
        tree.insert(10);*/
        System.out.println("Aufgabe B - Binaerer Suchbaum");
        //Ausgabe des Menues
        try {
            do {
                System.out.println("\n");
                tree.rwlGraph(tree.root, 0, 'W');
                System.out.println("\n\n  Menu:");
                System.out.println("Knoten hinzufuegen:\tA");
                System.out.println("Knoten loeschen:\tD");
                //System.out.println("\tFind node:       F");
                System.out.println("Baum ausgeben:\t\tP");
                System.out.println("Preorder:\t\twlr, wrl");
                System.out.println("Postorder:\t\tlrw, rlw");
                System.out.println("Inorder:\t\tlwr, rwl");
                System.out.println("Rotation:\t\trotL, rotR, rotDR");
                System.out.println("Hoehe Teilbaum:\t\th");
                System.out.println("Anzahl Knoten:\t\tc");
                System.out.println("Parent:\t\t\tx");
                System.out.println("Iterativ hinzufuegen:\ty");
                System.out.print("\n\nAuswahl: ");
                in = console.readLine().toUpperCase();

                switch (in.charAt(0)) {
                    case 'X':
                        System.out.print("Schluessel: ");
                        key = Integer.parseInt(console.readLine());
                        System.out.println("Parent: " + tree.getParent(key));
                        break;
                    case 'A': //Knoten hinzufuegen
                        System.out.print("key=");
                        key = Integer.parseInt(console.readLine());
                        tree.insert(key);
                        break;
                    case 'D':
                        System.out.print("key=");
                        key = Integer.parseInt(console.readLine());
                        tree.delete(key);
                        break;
                    /*case 'F':
                    System.out.print("key=");
                    key=console.intInputLine();
                    check=tree.find(key);
                    System.out.print("Found: "+check);
                    break;*/
                    case 'P':
                        tree.rwlGraph(tree.root, 0, 'W');
                        break;
                    case 'Y':
                        System.out.print("key=");
                        key = Integer.parseInt(console.readLine());
                        tree.insertIt(key);
                        break;
                    case 'H':
                        System.out.print("key=");
                        key = Integer.parseInt(console.readLine());
                        System.out.println("Hoehe des Teilbaums: " + tree.hoehe(key));
                        break;
                    case 'C':
                        System.out.print("key=");
                        key = Integer.parseInt(console.readLine());
                        System.out.println("Anzahl der Knoten: " + tree.countN(key));
                        break;
                    case 'L':
                        if (in.charAt(1) == 'W') {
                            tree.lwr(tree.root);
                        }
                        if (in.charAt(1) == 'R') {
                            tree.lrw(tree.root);
                        }
                        break;
                    case 'W':
                        if (in.charAt(1) == 'L') {
                            tree.wlr(tree.root);
                        }
                        if (in.charAt(1) == 'R') {
                            tree.wrl(tree.root);
                        }
                        break;
                    case 'R':
                        if (in.charAt(1) == 'L') {
                            tree.rlw(tree.root);
                        }
                        if (in.charAt(1) == 'W') {
                            tree.rwl(tree.root);
                        }
                        if (in.charAt(1) == 'O') {
                            if (in.charAt(3) == 'R') {
                                System.out.print("key=");
                                key = Integer.parseInt(console.readLine());
                                tree.rotateRight(key);
                            } else if (in.charAt(3) == 'L') {
                                System.out.print("key=");
                                key = Integer.parseInt(console.readLine());
                                tree.rotateLeft(key);
                            } else if (in.charAt(3) == 'D') {
                                System.out.print("key=");
                                key = Integer.parseInt(console.readLine());
                                tree.doubleRotate(key);
                            }
                        }
                        break;
                }
            } while (in.charAt(0) != 'E');
            System.out.print("\n");
        } catch (StringIndexOutOfBoundsException e) {
            System.out.println("Unknown command...");
            System.out.println("Exiting...");
        }
    }
}