begin process at 2008 07 05 14:26:39
1 205 204 membres
180 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ARBRE BINAIRE DE RECHERCHE


Information sur la source

Catégorie :Base de données Classé sous : arbre, binaire, recherche Niveau : Débutant Date de création : 27/12/2006 Date de mise à jour : 28/12/2006 12:10:45 Vu / téléchargé: 5 366 / 586

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

J'ai remarqué que codée un arbre binaire de recherche n'est pas évident et encore moin la suppression d'un noeud et l'affichage sous forme d'un arbre.

Voici ma source, dont je ne suis pas sûr à 100%. Donc si vous avez des remarques, merci d'avance.

Source

  • void Noeud::supprime(int nb)
  • {
  • // noeud->etiquette() == noeud->v
  • Noeud *tmp;
  • Noeud *pere_tmp;
  • if( nb < etiquette() )
  • if( fg->noeud_vide() ){
  • cerr<<endl<<"n.suppresssion: "<<nb;
  • cerr<<" n'appartient pas a l'arbre"<<endl;
  • }
  • else{
  • if( nb == fg->etiquette() )
  • if( (fg->fg)->noeud_vide()&& (fg->fd)->noeud_vide() ){
  • delete fg;
  • fg = VIDE;
  • }
  • else // fg a au moin un descendant :
  • if( (fg->fg)->noeud_vide() ){
  • tmp = fg;
  • fg = fg->fd;
  • delete tmp;
  • }
  • else // fg->fg existe :
  • if( (fg->fd)->noeud_vide() ){
  • tmp = fg;
  • fg = fg->fd;
  • delete tmp;
  • }
  • else{ // fg a exactement 2 descendants :
  • tmp = fg->fg;
  • pere_tmp = fg;
  • // tmp == max dans fg->fg
  • while(tmp->fd != VIDE){
  • pere_tmp = tmp;
  • tmp = tmp->fd;
  • }
  • if( tmp == fg->fg){
  • fg->v = (fg->fg)->v;
  • fg->fg = (fg->fg)->fg;
  • delete tmp;
  • }
  • else{
  • fg->v = tmp->v;
  • pere_tmp->fd = tmp->fg;
  • delete tmp;
  • }
  • }
  • else
  • fg->supprime(nb);
  • }
  • else // nb > v (égalité impossible par hypothèse)
  • if( fd->noeud_vide() ){
  • cerr<<endl<<"n.suppresssion: "<<nb;
  • cerr<<" n'apprtient pas a l'arbre binaire"<<endl;
  • }
  • else{
  • if( nb == fd->etiquette() )
  • if( (fd->fg)->noeud_vide() && (fd->fd)->noeud_vide() ){
  • delete fd;
  • fd = VIDE;
  • }
  • else // fd a au moin un descendant :
  • if( (fd->fg)->noeud_vide() ){
  • tmp = fd;
  • fd = fd->fd;
  • delete tmp;
  • }
  • else // fg->fg existe :
  • if( (fd->fd)->noeud_vide() ){
  • tmp = fd;
  • fd = fd->fg;
  • delete tmp;
  • }
  • else{ // fd a exactement 2 descendants :
  • tmp = fd->fg;
  • pere_tmp = fd;
  • // tmp == max dans fg->fg
  • while( tmp->fd != VIDE ){
  • pere_tmp = tmp;
  • tmp = tmp->fd;
  • }
  • if( tmp == fd->fg){
  • fd->v = (fd->fg)->v;
  • fd->fg = (fd->fg)->fg;
  • delete tmp;
  • }
  • else{
  • fd->v = tmp->v;
  • pere_tmp->fd = tmp->fg;
  • delete tmp;
  • }
  • }
  • else
  • fd->supprime(nb);
  • }
  • }
  • void Noeud::affiche_sous_arbre()
  • {
  • int h = hauteur()-1, i, j;
  • int *t = new int[h+1]; for(i=0; i<h; i++) t[i] = 1;
  • t[h] = 0; // sécurité pour éviter de sortir du tableau.
  • Noeud *tmp;
  • i = h-1;
  • bool test = true;
  • while( i >= 0 ){
  • tmp = recherche(t, h);
  • // affichage du noeud :
  • if( test && !tmp->noeud_vide() ){
  • for(j=0; t[j] == -1 || t[j] == 1; j++){
  • if( t[j+1] == 0 || j == h-1)
  • if( t[j] == -1 )
  • printf(" %c", 192);
  • else
  • printf(" %c", 218);
  • else
  • if( t[j]*t[j+1] == -1)
  • printf(" %c", 179);
  • else
  • printf(" ");
  • }
  • printf("%6d", tmp->etiquette());
  • if( tmp->fg != VIDE && tmp->fd != VIDE)
  • printf(" %c%c", 196, 180);
  • else
  • if( tmp->fg != VIDE )
  • printf(" %c%c", 196, 191);
  • else
  • if( tmp->fd != VIDE )
  • printf(" %c%c", 196, 217);
  • cout<<endl;
  • }
  • // noeud suivant :
  • switch(t[i]){
  • case 1:
  • t[i] = 0;
  • test = true;
  • break;
  • case 0:
  • t[i] = -1;
  • for(j=i+1; j<h; j++) t[j] = 1;
  • i = h-1;
  • test = true;
  • break;
  • case -1:
  • i--;
  • test = false;
  • break;
  • default:
  • cerr<<" ? "<<endl;
  • }
  • }
  • }
void Noeud::supprime(int nb)
{
    // noeud->etiquette() == noeud->v

    Noeud *tmp;
    Noeud *pere_tmp;

    if( nb < etiquette() )
        if( fg->noeud_vide() ){
            cerr<<endl<<"n.suppresssion: "<<nb;
            cerr<<" n'appartient pas a l'arbre"<<endl; 
        }
        else{
            if( nb == fg->etiquette() )
                if( (fg->fg)->noeud_vide()&& (fg->fd)->noeud_vide() ){
                    delete fg;
                    fg = VIDE;
                }
                else    // fg a au moin un descendant :
                    if( (fg->fg)->noeud_vide() ){
                        tmp = fg;
                        fg = fg->fd;
                        delete tmp;
                    }
                    else    // fg->fg existe :
                        if( (fg->fd)->noeud_vide() ){
                            tmp = fg;
                            fg = fg->fd;
                            delete tmp;
                        }
                        else{ // fg a exactement 2 descendants : 
                            tmp = fg->fg;
                            pere_tmp = fg;
                            // tmp == max dans fg->fg
                            while(tmp->fd != VIDE){ 
                                pere_tmp = tmp;
                                tmp = tmp->fd;
                            }
                            if( tmp == fg->fg){
                                fg->v  = (fg->fg)->v;
                                fg->fg = (fg->fg)->fg;
                                delete tmp;
                            }
                            else{
                                fg->v = tmp->v;
                                pere_tmp->fd = tmp->fg; 
                                delete tmp;
                            }
                        }
            else
                fg->supprime(nb);
        }
    else  // nb > v  (égalité impossible par hypothèse)
        if( fd->noeud_vide() ){
            cerr<<endl<<"n.suppresssion: "<<nb;
            cerr<<" n'apprtient pas a l'arbre binaire"<<endl; 
        }
        else{
			if( nb == fd->etiquette() )
                if( (fd->fg)->noeud_vide() && (fd->fd)->noeud_vide() ){
                    delete fd;
                    fd = VIDE;
                }
                else            // fd a au moin un descendant :
                    if( (fd->fg)->noeud_vide() ){
                        tmp = fd;
                        fd = fd->fd;
                        delete tmp;
                    }
                    else        // fg->fg existe :
                        if( (fd->fd)->noeud_vide() ){
                            tmp = fd;
                            fd = fd->fg;
                            delete tmp;
                        }
                        else{   // fd a exactement 2 descendants :
                            tmp = fd->fg;
                            pere_tmp = fd;
                            // tmp == max dans fg->fg
                            while( tmp->fd != VIDE ){ 
                                pere_tmp = tmp;
                                tmp = tmp->fd;
                            }
                            if( tmp == fd->fg){
                                fd->v  = (fd->fg)->v;
                                fd->fg = (fd->fg)->fg;
                                delete tmp;
                            }
                            else{
                                fd->v = tmp->v;
                                pere_tmp->fd = tmp->fg; 
                                delete tmp;
                            }
                        }
            else
                fd->supprime(nb);
        }
}

void Noeud::affiche_sous_arbre()
{
    int h = hauteur()-1, i, j;
    int *t = new int[h+1]; for(i=0; i<h; i++) t[i] = 1;
    t[h] = 0;   // sécurité pour éviter de sortir du tableau.
    Noeud *tmp;
    i = h-1;
    bool test = true;
    while( i >= 0 ){
        tmp = recherche(t, h);
        
        // affichage du noeud :
        if( test && !tmp->noeud_vide() ){
            for(j=0; t[j] == -1 || t[j] == 1; j++){
                if( t[j+1] == 0 || j == h-1)
                    if( t[j] == -1 )
                        printf("        %c", 192);
                    else
                         printf("        %c", 218);
                else
                    if( t[j]*t[j+1] == -1) 
                        printf("        %c", 179);
                    else
                        printf("         ");
            }
            printf("%6d", tmp->etiquette());
            if( tmp->fg != VIDE && tmp->fd != VIDE)
                printf(" %c%c", 196, 180);
            else
                if( tmp->fg != VIDE ) 
                    printf(" %c%c", 196, 191);
                else
                    if( tmp->fd != VIDE ) 
                        printf(" %c%c", 196, 217);
            cout<<endl;
        }
        
        // noeud suivant :
        switch(t[i]){
            case 1:
                t[i] = 0;
                test = true;
                break;
            case 0:
                t[i] = -1;
                for(j=i+1; j<h; j++) t[j] = 1;
                i = h-1;
                test = true;
                break;
            case -1:
                i--;
                test = false;
                break;
            default:
                cerr<<" ? "<<endl;
        }
    }
    
}
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

28 décembre 2006 12:10:45 :
J'ai modifié l'affichage de l'arbre. Il ressemble plus à un arbre maintenant :)
    Aucun commentaire pour le moment.

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS