public class BinaryTreeTest {

    public static void main(String[] args) {
        new BinaryTreeTest().run();
    }

    static class Node {
        Node left;
        Node right;
        int value;

        public Node(int value) {
            this.value = value;
        }
    }

    public void run() {
        // zbuduj proste drzewo z rozdziału 11.
        Node root = new Node(5);
        System.out.println("Przykład drzewa binarnego");
        System.out.println("Budowa drzewa z wartością w korzeniu: " +
            root.value);
        insert(root, 1);
        insert(root, 8);
        insert(root, 6);
        insert(root, 3);
        insert(root, 9);
        System.out.println("Poprzeczne przeszukiwanie drzewa");
        printInOrder(root);
        System.out.println("Przeszukiwanie drzewa od przodu do tyłu od położenia 7");
        printFrontToBack(root, 7);
    }


    public void insert(Node node, int value) {
        if (value < node.value) {
            if (node.left != null) {
                insert(node.left, value);
            }
            else {
                System.out.println("  Inserted " + value +
                    " to left of " + node.value);
                node.left = new Node(value);
            }
        }
        else if (value > node.value) {
            if (node.right != null) {
                insert(node.right, value);
            }
            else {
                System.out.println("  Inserted " + value +
                    " to right of " + node.value);
                node.right = new Node(value);
            }
        }
    }


    public void printInOrder(Node node) {
        if (node != null) {
            printInOrder(node.left);
            System.out.println("  Odwiedzony węzeł: " + node.value);
            printInOrder(node.right);
        }
    }

    /**
        Używa metody przeglądania poprzecznego, jeśli przodek jest mniejszy od
        wartości potomka.

        Używa metody przeglądania wstecznego, jeśli przodek jest większy od
        wartości potomka.
    */
    public void printFrontToBack(Node node, int camera) {
        if (node == null) return;
        if (node.value > camera) {
            // wyświetla w kolejności poprzecznej
            printFrontToBack(node.left, camera);
            System.out.println("  Odwiedzony węzeł: " + node.value);
            printFrontToBack(node.right, camera);
        }
        else if (node.value < camera) {
            // wyświetla w kolejności wstecznej
            printFrontToBack(node.right, camera);
            System.out.println("  Odwiedzony węzeł: " + node.value);
            printFrontToBack(node.left, camera);
        }
        else {
            // kolejność nie ma znaczenia
            printFrontToBack(node.left, camera);
            printFrontToBack(node.right, camera);
        }
    }


}
