begin process at 2012 05 27 13:41:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > ARBRE BINAIRE DE RECHERCHE

ARBRE BINAIRE DE RECHERCHE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :17 005 / 1 314

Auteur : laderivier

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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;
        }
    }
    
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

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

 Sources du même auteur

Source avec Zip VECTEUR3D
Source avec Zip BANTUMI

 Sources de la même categorie

GESTION DE FICHIER ET DOSSIER + AUTRES par shinji63
Source avec une capture CONVERTISSEUR par smartties
Source avec Zip CREATION D'UN FICHIER DBF (EN C) par Stanel
Source avec Zip STRUCTURE DES FICHIERS DBF par Stanel
Source avec Zip Source avec une capture GESTION DES ENTREES/ SORTIES AVEC CODEBARRE par YvaddavY

 Sources en rapport avec celle ci

ARBRE BINAIRE ORDONÉE HORIZONTALEMENT par dadamagouil
Source avec Zip PARCOURS D'UN ARBRE par krissssss
ARBRE BINAIRE (NON-EQUILIBRE) par JCDjcd
Source avec Zip ALGORITHME DE RECHERCHE DICHOTOMIQUE par deck_bsd
Source avec Zip MANIPULATION D'ARBRE BINAIRE ORDONNÉ EN C par Haldwin

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

arbre binaire de recherche equilibrée [ par mrihab ] salut je suis une etudiante en informatique je veux savoir comment realiser une interface graphique representant cette arbre binaire equilibrée arbre binaire de recherche [ par ing_ensi ] salut,j'ai besoin d' un code source sur la manipulation d'un arbre binaire de recherche:creation +suppression avec graphisme.merci bien. URGENT !! creation d'un arbre binaire de recherche a partir d'une liste non ordonnee [ par kochali ] Bonjour,Je débute en LISP et j'aimerais des pistes pour savoir comment créer un arbre binaire de recherche à partir d'une liste non ordonnée.Comment e recherche dans un arbre n-aire [ par affaf09 ] salut je veux l'algourithme qui permet l'insertion,et la supression dans un arbre n-aire en c svp fonctions concernants les arbres binaires ?? [ par onh890 ] salut les amis. je voudrais bien que quelqu'un m'indique les fonctions suivantes: 1)la fonction qui transforme un arbre binaire ordinaire en arbre bi Problème d'insértion de la clé dans un arbre binaire de recherche récursivement [ par polobou ] [b]BONJOUR[/b][^^happy8] Comment insérer la clé dans un arbre binaires de recherche récursivement sans utiliser par exemple un tableau [b]Merci[/b][ arbre binaire [ par googlaz ] [^^yeuxenlair]svp je veut savoir comment créer un arbre binaire à 20 noeuds[^^sad1][^^sad1][^^sad1] c urgent aidez moiiiiiiiiiiiiiiiiiiiiiii[^^sad2] passage d'un arbre binaire ordonné à un tableau [ par thaaabet ] bonjour;est ce que quelqu'un peut m'aider de me donner l'algorithme ou la fonction c du passage d'un arbre binaire ordoné vers un tableau triée comme Arbre binaire [ par granoli ] Bonjour, et bonne année 2007,J'aimerais un algorithme simple de création d'arbre binaire.J'ai bien compris le concept des arbres binaires mais j'ai du


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales