class TreeNode {
    int data;
    TreeNode left;
    TreeNode right;

 

    public TreeNode(int data) {
        this.data = data;
        left = null;
        right = null;
    }
}

 

public class CountingSortInorder {
    public static void countingSort(int[] arr) {
        int max = Arrays.stream(arr).max().getAsInt();
        int min = Arrays.stream(arr).min().getAsInt();
        int range = max - min + 1;
        int[] count = new int[range];
        int[] output = new int[arr.length];

 

        // Llena el arreglo de conteo.
        for (int num : arr) {
            count[num - min]++;
        }

 

        // Reconstruye la matriz ordenada.
        int index = 0;
        for (int i = min; i <= max; i++) {
            while (count[i - min] > 0) {
                output[index++] = i;
                count[i - min]--;
            }
        }

 

        // Copia la matriz ordenada de vuelta a la matriz original.
        System.arraycopy(output, 0, arr, 0, arr.length);
    }

 

    public static void inorder(TreeNode root) {
        if (root != null) {
            // Realiza el recorrido inorder en el subárbol izquierdo.
            inorder(root.left);
            // Procesa el nodo actual (puedes imprimirlo aquí).
            System.out.print(root.data + " ");
            // Realiza el recorrido inorder en el subárbol derecho.
            inorder(root.right);
        }
    }

 

    public static void main(String[] args) {
        int[] arr = {4, 2, 2, 8, 3, 3, 1};

 

        System.out.println("Matriz original:");
        for (int num : arr) {
            System.out.print(num + " ");
        }

 

        countingSort(arr);

 

        System.out.println("\nÁrbol con recorrido Inorder:");
        TreeNode root = buildTree(arr);
        inorder(root);
    }

 

    // Función para construir un árbol binario a partir del arreglo.
    public static TreeNode buildTree(int[] arr) {
        return buildTreeHelper(arr, 0, arr.length - 1);
    }

 

    // Función auxiliar para construir el árbol binario recursivamente.
    private static TreeNode buildTreeHelper(int[] arr, int low, int high) {
        if (low > high) {
            return null;
        }

 

        int mid = (low + high) / 2;
        TreeNode root = new TreeNode(arr[mid]);

 

        root.left = buildTreeHelper(arr, low, mid - 1);
        root.right = buildTreeHelper(arr, mid + 1, high);

 

        return root;
    }
} dame este codigo mas sencillo y borra el class treenode