public static AABRI randomAABRI(int nbreNoeuds, int valeurMaxAABRI) {

        if (valeurMaxAABRI < 2 * nbreNoeuds) {
            throw new RuntimeException("valeurMaxABRI doit être >= 2 * NbreNoeuds + 1 pour pouvoir générer des intervalles non chevauchants!");
        }

        // Tableau contenant les valeurs
        Integer[] valeurs;

        // Pointeur sur le noeud utilisé lors de l'ajout dans l'AABRI
        AABRINode treeNode;

        // AABRI retour de la fonction
        AABRI ret = new AABRI();

        // Récupération d'un tableau de bornes constituant toutes les bornes des noeuds de l'AABRI
        Integer[] bornes = TreeUtils.getRandomIntervals(nbreNoeuds, valeurMaxAABRI);

        // Liste contenant les bornes (les tableaux contenus sont donc de taille 2)
        List<Integer[]> bornesRandom = new ArrayList<>(bornes.length / 2);

        // Mélange des couples de bornes qui se suivent pour que l'arbre généré ne soit pas construit avec des noeuds insérés dans l'ordre croissant
        // (le tableau des bornes est trié dans l'ordre croissant)
        for (int i = 0; i < bornes.length; i = i + 2) {
            Integer[] tempTab = {bornes[i], bornes[i + 1]};
            bornesRandom.add(tempTab);
        }

        // Mélange des couples de bornes
        Collections.shuffle(bornesRandom);

        if (bornes.length != nbreNoeuds * 2) {
            throw new RuntimeException("Le nombre de bornes générées n'est pas bon !");
        }

        // On place les bornes dans une liste permettant de les récupérer.
        // Création des TreeNodes contenant les ABRI et ajout dans l'AABRI
        for (Integer[] tab : bornesRandom) {

            // Création d'un noeud d'AABRI avec les deux bornes
            treeNode = new AABRINode(tab[0], tab[1], null, TypeABR.ARBRE_BINAIRE_RECHERCHE_INVERSE);

            // Récupération d'un tableau contenant les valeurs du noeud
            valeurs = TreeUtils.getRandomIntegers(tab[0], tab[1]);

            // Ajout des noeuds simples dans l'ABRI
            for (Integer valeur : valeurs) {
                try {
                    treeNode.insert(valeur);
                } catch (ValeurDejaPresenteException e) {
                    System.out.println(e.getMessage());
                }
            }
            try {
                ret.insert(treeNode);
            } catch (IntervalleChevauchantException e) {
                System.out.println(e.getMessage());
            }
        }
        return ret;
    }