Arbre *CreerAbreCannoniser(ListeCouple **chaineReduite,int niveau,Arbre *arbCour){ ListeCouple *CaseCour = *chaineReduite ; while(CaseCour != NULL ) { if(CaseCour->noeud->ponderation == niveau) { if(arbCour->filsDroit==NULL && arbCour->ponderation == -1) { //rien nest present au niveau du fils droite et il s'agit d'un noeud -> ajout a droite et on peut plus rien faire ici arbCour->filsDroit = CaseCour->noeud ; supprime(CaseCour->noeud,chaineReduite) ; } //ajout a gauche si possible, sinon rien! else{ if(arbCour->filsGauche==NULL && arbCour->ponderation == -1 ) { //rien nest present au niveau du fils gauche et il s'agit d'un noeud -> ajout a gauche et on peut plus rien faire ici arbCour->filsGauche = CaseCour->noeud ; supprime(CaseCour->noeud,chaineReduite) ; } } } CaseCour = CaseCour->suivant ; } if(arbCour->filsDroit==NULL && arbCour->filsGauche == NULL ) //Si aucune feuille n'a été rajouté au noeud { niveau++; arbCour->filsDroit = CreerAbreCannoniser(chaineReduite,niveau,newArbre(0,-1)); arbCour->filsGauche =CreerAbreCannoniser(chaineReduite,niveau,newArbre(0,-1)); } if(arbCour->filsGauche==NULL && arbCour->ponderation == -1)// Si une feuille a été rajouté à droite du noeud { arbCour->filsGauche = CreerAbreCannoniser(chaineReduite,++niveau,newArbre(0,-1)); } //On retourne arbCour une fois les appels récursifs terminée return arbCour; }
int main(int argc, char *argv[]) { size_t i; HashTable *h = alloue(13); for(i=0; i<50; ++i) insere(i, h); affiche(h); insere(16, h); insere(27, h); insere(256, h); insere(30, h); affiche(h); if(appartient(27, h)) puts("27 appartient à la table de hachage."); else puts("27 n'appartient pas à la table de hachage."); supprime(256, h); supprime(23, h); for(i=0; i<30; ++i) supprime(i, h); affiche(h); detruit(&h); affiche(h); return EXIT_SUCCESS; }
//recupere le noeud de ponderation minimale //supprime la case du min Arbre *recupMin(ListeCouple **tete){ if(*tete==NULL) return NULL; int min = (*tete)->noeud->ponderation; Arbre *arb=(*tete)->noeud; ListeCouple *courant=*tete; while(courant != NULL){ if(min > courant->noeud->ponderation){ min = courant->noeud->ponderation; arb = courant->noeud; } courant = courant->suivant; } supprime(arb, tete); return arb; }