private void remonterNoeudUnCran(NoeudArbre<E> noeud) {
        assert (noeud.pere != NIL) : "Noeud.pere = NIL";
        // père du noeud
        NoeudArbre<E> p = noeud.pere;
        // fils droit du noeud
        NoeudArbre<E> d = noeud.filsDroit;
        // fils gauche du noeud
        NoeudArbre<E> g = noeud.filsGauche;
        // grand père du noeud
        NoeudArbre<E> gp = noeud.pere.pere;

        if (noeud == p.filsDroit) {
            // la clef du noeud est plus grande que celle de son père.
            noeud.filsGauche = p;
            p.filsDroit = g;
            g.pere = p;

        } else {
            if (noeud == p.filsGauche) {
                // la clef du noeud est plus petite que celle de son père.
                noeud.filsDroit = p;
                p.filsGauche = d;
                d.pere = p;
            } else {
                // Cas impossible
                System.err.println("Etat incohérent : le noeud doit être forcement le fils gauche ou droit de son père");
            }
        }

        if (gp != NIL) {
            if (p == gp.filsDroit) {
                gp.filsDroit = noeud;
            } else {
                if (p == gp.filsGauche) {
                    gp.filsGauche = noeud;
                } else {
                    // Cas impossible
                    System.err.println("Etat incohérent : le père du noeud doit être forcement le fils gauche ou droit du grand père du noeud");
                }
            }
        } else {
            // le grand père est NIL => le pere était root, donc notre noeud devient root
            root = noeud;
        }
        // le grand père du noeud devient son père
        noeud.pere = gp;
        // le noeud devient le père de son père.
        p.pere = noeud;
    }