Passer au forum
Arbre binaire de re...
 
Notifications
Retirer tout

[Fermé] Arbre binaire de recherche en C (aide)

70 Messages
11 Utilisateurs
0 Réactions
5,756 Vues
Tchenou Auteur du sujet
Tchenou
Inscrit : 10.05.2008
Elite Grinder

Allez une toute dernière si qqun passe par là (sinon tant pis je l'envois comme çà ce soir :D ) :

void fusionTree(struct tree *T, struct node *nodeU){

if (nodeU != NULL){

insertKey(nodeU->value,T);
fusionTree(T,nodeU->lChild);
fusionTree(T,nodeU->rChild);

}
else return;
}

La fonction devrait aussi théoriquement supprimer l'arbre U après l'avoir insérer dans T

Le problème c'est quand je fais appel a nodeDeleteKey que ce soit dans le if ou le else, ca foire (boucle infinie ou truc dans le genre)


Vive google. Vous m'avez pas mal aidé moi aussi :D
Meme si je cale pour l'arbre enrichi, la fusion j'ai fini.

En fait, je fais une boucle while tout pareil, sans utiliser la recursion ...

Je comprend pas pourquoi tu prends une structure "node" en deuxieme argument.
U, c'est un arbre ...

Sinon, j'ai casé un deleteTree avant return ...


chika78
Inscrit : 06.08.2009
PokerStrategist

Essaye avec cette version.

En fait une fonction ne devrait pas faire un free() d'un pointeur qui lui est passé en paramètre, car la valeur du paramètre ne change pas pour l'appelant.

void nodeDeleteKey(struct node *n) {
  if (n != NULL) {
    nodeDeleteKey(n->lChild);
    free(n->lChild);
    nodeDeleteKey(n->rChild);
    free(n->rChild);
    n->lChild = n->rChild = NULL;
  }
}

void fusionTree(struct tree *T, struct node *n) {
  if (n != NULL) {
    insertKey(n->value, T);
    fusionTree(T, n->lChild);
    fusionTree(T, n->rChild);
    nodeDeleteKey(n);
  }
}

Tchenou Auteur du sujet
Tchenou
Inscrit : 10.05.2008
Elite Grinder

Un admin pourrait-il supprimer ce thread par sécurité svp ? :D


ZeNakedMan
Inscrit : 20.02.2011
PokerStrategist

Message original de Tchenou
Allez une toute dernière si qqun passe par là (sinon tant pis je l'envois comme çà ce soir :D ) :

void fusionTree(struct tree *T, struct node *nodeU){

if (nodeU != NULL){

insertKey(nodeU->value,T);
fusionTree(T,nodeU->lChild);
fusionTree(T,nodeU->rChild);

}
else return;
}

La fonction devrait aussi théoriquement supprimer l'arbre U après l'avoir insérer dans T

Le problème c'est quand je fais appel a nodeDeleteKey que ce soit dans le if ou le else, ca foire (boucle infinie ou truc dans le genre)

Ta fonction, c'est un void, et tu fait un return. Si tu affiche tes warnings (ac -g3 pour unix ou autre), tu risque d'avoir plein de warnings sur ton compilo. Dans mon école, tu peux pas avoir mieux que 0 avec un code comme ça (0 étant la note maximale), et avec -1 par warnings, sa va vite :) ).

void fusionTree(struct tree *T, struct node *nodeU)
{
if (nodeU)
{
insertKey(nodeU->value,T);
fusionTree(T,nodeU->lChild);
fusionTree(T,nodeU->rChild);
}
}

Je connais pas le code, mais sa doit surement être mieux :)


chika78
Inscrit : 06.08.2009
PokerStrategist

Pas d'accord.
Il n'est pas totalement absurde d'utiliser return (sans value renvoyée), pour sortir d'une fonction void.

void function foo() {
{ traitement ... }
if (cond_speciale) return;
{ ... suite }
}

Après, il vaut mieux sortir d'une fonction en un point unique, c'est vrai.


Piskou
Inscrit : 08.05.2009
PokerStrategist

j'ai lu en diagonale et je ne sais pas si c'est encore d'actualité mais je me demande quand meme pourquoi vouloir coder une fonction deleteKey qui cherche la valeur ou a contrario, qui recoit un node, alors qu'on deleteKey (donc sur base de la clé) ?

si tu posséde une fonction

node findKey(int key, node tree) qui te renvoie la valeur cherchée

pourquoi ne pas faire la fonction deleteKey comme ca:

void deleteKey(int key, node tree)
{
....node target = findKey(key, tree);
....les tests sur les fils droites / gauches, les rotations en cas de besoin, etc ^^
}

par contre chika je n'aime pas ta version, car si je te donne la racine, tu détruit l'arbre en entier, au lieu de simplement supprimer une valeur

ou alors j'aurai du lire plus en détails, et je n'ai rien dit ;)


chika78
Inscrit : 06.08.2009
PokerStrategist

J'en reviens à ce que j'ai dit plus haut : ce genre de code ne peut (et ne devrait) qu'être récursif pour être efficace.

Et n'oublions pas :

"Pour comprendre la récursivité, il faut d'abord comprendre la récursivité" :D


ZeNakedMan
Inscrit : 20.02.2011
PokerStrategist
Tchenou Auteur du sujet
Tchenou
Inscrit : 10.05.2008
Elite Grinder

Admiiiiiin ? :D