Odenelle a écrit 4 commentaires

  • [^] # Re: je ne suis pas un pro en java

    Posté par  . En réponse au message [JAVA] Suppression dans un arbre binaire ordonné. Évalué à 1. Dernière modification le 08 janvier 2014 à 20:49.

    Bon bein je n'ai rien trouvé de mieux que ca :'( , projet rendu :

        // Cette méthode n'est pas la meilleure, mais faute de temps nous l'avons choisie... On recrée un arbre et on modifie les sous arbres 
            public V remove(V val) {
                // La premiere valeur de l'arbre qu'on recrée
                V premiereValeur = this.value;
    
                // Si la valeur a supprimer est la racine on change la racine
                if ((this.value).equals(val)) {
                    // Si il y a un sous arbre gauche on prend sa valeur
                    if (this.SAG != null) {
                        premiereValeur = this.SAG.value;
                    } // Sinon le sous arbre droit
                    else {
                        premiereValeur = this.SAD.value;
                    }
                }
    
                // On stocke les valeurs actuelles de l'arbre
                ArrayList<V> listeValeurs = (ArrayList) this.values();
    
                // On crée notre arbre résultat
                GenericBinaryTree res = new GenericBinaryTree(premiereValeur);
    
                // Et on le remplit sans prendre la premiere valeur et celle a exclure
                for (V e : listeValeurs) {
                    if (e != val && e != premiereValeur) {
                        res.put(e);
                    }
                }
    
                // Puis on recrée notre arbre
                this.value = premiereValeur;
                this.SAG = res.SAG;
                this.SAD = res.SAD;
    
                // Et on retourne la valeur sortie
                return val;
            }
  • [^] # Re: je ne suis pas un pro en java

    Posté par  . En réponse au message [JAVA] Suppression dans un arbre binaire ordonné. Évalué à 1.

    Merci NeoX je crois voir mieux comment construire mon algo !! Je m'y attèle demain des que j'ai un résultat je le poste :)

  • [^] # Re: je ne suis pas un pro en java

    Posté par  . En réponse au message [JAVA] Suppression dans un arbre binaire ordonné. Évalué à 1.

    dans ton cas, descendre dans le sous arbre de l'element que tu veux supprimer
    et pour chaque noeud, faire la recherche min/max
    pour repositionner chacun des enfants apres la suppression

    En fait quand je suis dans le sous arbre qui a pour racine le noeud a supprimer, que dois-je faire ? C'est a ce niveau que je bloque..
    Comment gérer le cas ou c'est une feuille aussi (on le supprime direct) ou encore qu'il a un seul sous-arbre sur les deux (ce qui fait que ce dernier doit remplacer le noeud a supprimer)…
    J'arrive pas a construire mon algo :s

  • [^] # Re: je ne suis pas un pro en java

    Posté par  . En réponse au message [JAVA] Suppression dans un arbre binaire ordonné. Évalué à 1. Dernière modification le 04 janvier 2014 à 20:04.

    Merci pour ta réponse.
    Tu es sûr pour les accolades fermantes ? Je n'ai pas d'erreur de compilation pourtant…

    En fait je suis censé gérer 3 cas avec mon algo (cf wikipédia) :

    1) Suppression d'une feuille : Il suffit de l'enlever de l'arbre vu qu'elle n'a pas de fils.
    2) Suppression d'un nœud avec un enfant : Il faut l'enlever de l'arbre en le remplaçant par son fils.
    3) Suppression d'un nœud avec deux enfants : Supposons que le nœud à supprimer soit appelé N. On échange le nœud N avec son successeur le plus proche (le nœud le plus à gauche du sous-arbre droit) ou son plus proche prédécesseur (le nœud le plus à droite du sous-arbre gauche).
    Puis on applique à nouveau la procédure de suppression à N, qui est maintenant une feuille ou un nœud avec un seul fils.

    Mon code ressemble a ceci actuellement et ne marche toujours pas :

        // Supprime un noeud a partir de sa valeur 
            public void remove(V val) {
    
                GenericBinaryTree<V> noeudConcerne, pereNoeud;
    
    
                // Le noeud concerné est celui qu'on veut supprimer
                noeudConcerne = this.trouverNoeud(val);
    
    
                // Si le noeud concerné a un sous arbre gauche
                if (noeudConcerne.SAG != null) {
                    // pereNoeud est le pere du maximum du SAG du noeud
                    pereNoeud = this.SAG.perMax();
                    System.out.println("coucou1");
                    // Si il est nul alors
                    if (pereNoeud == null) {
                        this.value = this.SAG.value;
                        this.SAG = this.SAG.SAG;
                        System.out.println("coucou2");
                    } else {
                        this.value = pereNoeud.SAD.value;
                        pereNoeud.SAD = pereNoeud.SAD.SAG;
                        System.out.println("coucou3");
                    }
    
                }
    
                if (noeudConcerne.SAD != null) {
                    // pereNoeud est le pere du minimum du SAD du noeud
                    pereNoeud = this.SAD.perMin();
                    System.out.println("coucou4");
                    // Si il est nul alors
                    if (pereNoeud == null) {
                        System.out.println("coucou5");
                        this.value = this.SAD.value;
                        this.SAD = this.SAD.SAD;
                    } else {
                        System.out.println("coucou6");
                        this.value = pereNoeud.SAG.value;
                        pereNoeud.SAG = pereNoeud.SAG.SAD;
                    }
                }
            }

    En algo la réponse me va très bien je la retranscrirai en java, mais c'est vraiment dur a trouver j'ai du mal avec la récursivité