import java.lang.reflect.Array;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4,5, 6, 7};
        Arrays.sort(array);
    BST tree = BST.createBSTFromArray(array);
    tree.inorder();
    }

}

class BST {
    static class Node {
        int info;
        Node left, right;

        Node(int info) {
            this.info = info;
            left = null;
            right = null;
        }
    }
    Node root;
    BST() {
        root = null;
    }
    void insert(int value) {
        root = insertRecursive(root, value);
    }
    Node insertRecursive(Node node, int value) {
        if(node == null) {
            node = new Node(value);
            return node;
        }
        if(value < node.info) {
            node.left = insertRecursive(node.left, value);
        }
        else if(value > node.info) {
            node.right = insertRecursive(node.right, value);
        }
        return node;
    }
    void delete(int value) {
        root = deleteRecursive(root, value);
    }
    Node deleteRecursive(Node node, int value) {
        if(node == null) {
            return null;
        }

        if(value < node.info) {
            node.left = deleteRecursive(node.left, value);
        }
        else if(value > node.info) {
            node.right = deleteRecursive(node.right, value);
        }
        else if(value == node.info){ // sme go nasle, treba da go izbriseme
            if(node.left == null) {
                return node.right;
            }
            else if(node.right == null) {
                return node.left;
            }
            node.info = findMinimumValue(node.right);
            node.right = deleteRecursive(node.right, node.info);
        }
        return node;
    }
    int findMinimumValue(Node node) {
        int result = node.info;
        while(node.left != null) {
            result = node.left.info;
            node = node.left;
        }
        return result;
    }
    void inorder() {
        inorderRecursive(root);
    }
    void inorderRecursive(Node node) {
        if(node == null) {
            return;
        }
        inorderRecursive(node.left);
        System.out.println(node.info + " ");
        inorderRecursive(node.right);
    }
     public static BST createBSTFromArray(int[] array) {
        BST newTree = new BST();
        if(array.length > 0) {
            newTree.root = createBSTFromArrayRecursive(array, 0, array.length - 1);
        }
        return newTree;
    }
    public static Node createBSTFromArrayRecursive(int[] array, int L, int R) {
        if(L > R) {
            return null;
        }
        int middle = (L + R) / 2;
        Node root = new Node(array[middle]);
        root.left = createBSTFromArrayRecursive(array, L, middle - 1);
        root.right = createBSTFromArrayRecursive(array, middle + 1, R);

        return root;
    }
}
