IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Insertion arbre ternaire


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut Insertion arbre ternaire
    Bonsoir a vous,
    J'essaye de coder en C l'insertion de mots dans un arbre ternaire...
    Mais je suis bloqué au niveau de l'algorithme...

    Si vous pouviez me donner des pistes.

    Merci par avance

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Peux-tu nous dire à quel point tu bloques ? Ce que tu as fait ?

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    J'ai essaye de le coder en C, mais comme je ne vois pas l'algorithme qu'il faut utiliser...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    si le noeud est null
    --- Ajouter le tout ds le fils du milieu
    sinon
    --- lettre < f->lettre
    ------on relance la fonction en descendant dans l'arbre par le fils gauche
    --- lettre > f->lettre
    ------on relance la fonction en descendant dans l'arbre par le fils droit
    --- lettre == f->lettre
    ------on relance la fonction en descendant dans l'arbre par le fils
    voila...

    Merci pour votre aide

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Expliques nous ta structure de données et comment elle fonctionne. Il y a de fortes chances qu'en nous l'expliquant tu puisses trouver ton algorithme.

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Il s'agit d'une structure de tri lexicographique par dichotomie.
    L'ajout insert et la recherche find s'implémentent de façon assez immédiate, par exemple en OCaml (le code en marron est le type inféré par OCaml):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    module Ternary = struct
    
    type t =
      | Nil
      | Node of t * char * t * t
    
    let rec insert t l =
      match t,l with
      | Nil,[] ->
          t
      | Node(less,chr,equal,more),[] ->
          t
      | Nil,c::d ->
          Node(Nil,c,insert Nil d,Nil)
      | Node(less,chr,equal,more),c::d ->
          if c < chr then Node(insert less l,chr,equal,more)
          else if c > chr then Node(less,chr,equal,insert more l)
          else Node(less,c,insert equal d,more) 
    
    let rec find t l =
      match t,l with
      | Nil,[] ->
          true
      | Node(less,chr,equal,more),[] ->
          true
      | Nil,c::d ->
          false
      | Node(less,chr,equal,more),c::d ->
          if c < chr then find less l
          else if c > chr then find more l
          else find equal d       
    
    end;;
    module Ternary :
      sig
        type t = Nil | Node of t * char * t * t
        val insert : t -> char list -> t
        val find : t -> char list -> bool
      end
    
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Salut!

    C'est un peu tard!
    Voici le code de l'ajout d'un mot dans un arbre ternaire lexicographique en langage C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    void ajoutMot(ArbreT *arbre,int pos,char *val){
     
    	/* arbre est null => on est arrivé a un endroit ou on peut insérer la lettre => la racine devient le nouvel arbre
    	 * puis continuera eventuellement son parcours dans la derniere condition si il reste des lettres a inserer 
    	 * */
    	if(*arbre == NULL){
    		ArbreT arbreNew = creerArbreT();
    		arbreNew->val = val[pos];
    		*arbre = arbreNew;
     
    		/*  
    		 * Si la lettre parcouru n'est pas \0 donc la fin du mot alors on *continu a ajouter les lettres du mot en avant
    		 * 
    		 */
    		if(val[pos] != '\0'){
    			ajoutMot(&((*arbre)->filsMilieu),pos+1,val);
    		}
    	}
    	/* on trouve la meme valeur dans l'arbre, alors on insere pas car cette lettre y est deja, on fait juste
    	 * de continuer le parcours en avant et on passe a la lettre suivante a inserer*/
    	else if((*arbre)->val == val[pos]){
    		return ajoutMot(&((*arbre)->filsMilieu),pos+1,val);
    	}
    	/* notre lettre a insere est plus grande, alors on doit l'inserer a droite de l'arbre courant, on appel
    	 * la fonction sur le fils droit avec pos et non pos+1 car on a pas encore insere la valeur*/
    	else if((*arbre)->val < val[pos]){
    		return ajoutMot(&((*arbre)->filsDroit),pos,val);
    	}
    	/* notre lettre a insere est plus petite, alors on doit l'inserer a gauche de l'arbre courant, on appel
    	 * la fonction sur le fils gauche avec pos et non pos+1 car on a pas encore insere la valeur*/
    	else if((*arbre)->val > val[pos]){
    		return ajoutMot(&((*arbre)->filsGauche),pos,val);
    	}
    }
    Je sais pas si C'est super bien codé mais ca marche bien en tout cas.

Discussions similaires

  1. Arbre ternaire
    Par maxori64 dans le forum Langage
    Réponses: 6
    Dernier message: 13/05/2015, 22h01
  2. Insertion arbre AVL c
    Par Antoine2220 dans le forum C
    Réponses: 2
    Dernier message: 02/12/2014, 23h07
  3. Arbre ternaire complet
    Par guyomel dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 16/09/2008, 12h37
  4. Arbre Ternaire - Suppression
    Par jurio dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/08/2008, 19h48
  5. Ajout dans arbre ternaire
    Par line86 dans le forum C
    Réponses: 0
    Dernier message: 27/05/2008, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo