C > Arbre complet p3

TitreArbre complet p3
Postée le30-11-2010
Affichée273
Mini-lien
Description

Arbre de recherche pour tritab

EtatContient des erreurs. Contient des erreurs.
Code d'insertion
Options
Afficher les numéros de lignes  Mettre la source en plein ecran  Selectionner la source  Partager sur Facebook 
Téléchargement Telecharger en format txt  Telecharger en format pdf  Telecharger en format c
Plein ecran
#include <stdio.h>
#include <stdlib.h>

typedef struct noeud{
        int donnee;
        struct noeud * fg;
        struct noeud * fd;
}*Arbre;

Arbre initArbre(){
        Arbre a;
        a=NULL;
        return a;
}

int videArbre(Arbre a){
        return a==NULL;
}

int DonneeArbre(Arbre a){
        return a->donnee;
}

Arbre FilsGauche(Arbre a){
        return a->fg;
}

Arbre FilsDroit(Arbre a){
        return a->fd;
}

int Feuille(Arbre a){
        if (FilsDroit(a)==NULL&&FilsGauche(a)==NULL) {
                return 1;
        }
        else return 0;
}

Arbre creatFeuille(int elt){
        Arbre a;
        a=(Arbre)malloc(sizeof(struct noeud));
        a->donnee=elt;
        a->fg=NULL;
        a->fd=NULL;
        return a;
}

Arbre creatNoeud(int elt, Arbre filsg, Arbre filsd){
        Arbre nd;
        nd=(Arbre)malloc(sizeof(struct noeud));
        nd->donnee=elt;
        nd->fg=filsg;
        nd->fd=filsd;
        return nd;
}

void ParcoursInfixe(Arbre a){
        if (!videArbre(a)) {
                ParcoursInfixe(FilsGauche(a));
                printf("%i\n",DonneeArbre(a)); // on peut remplacer le printf par ce qu'on veut
                ParcoursInfixe(FilsDroit(a));
        }
}

void suppArbre(Arbre a){
        if (!videArbre(a)) {
                suppArbre(FilsGauche(a));
                suppArbre(FilsDroit(a));
                free(a);
        }
}


void insertEltArbreRech(Arbre *a, int elt){
        if (videArbre(*a)) {
                *a=creatFeuille(elt);
        }
        else {
                if (elt<=DonneeArbre(*a)){
                        insertEltArbreRech(&((*a)->fg), elt);
                }
                else {
                        insertEltArbreRech(&((*a)->fd), elt);
                }

        }
}

void infixeABRtab(int n, Arbre a, int *tab){
        if (!videArbre(a)) {
                infixeABRtab(n,FilsGauche(a),tab);
                tab[n]=DonneeArbre(a);
                n++;
                infixeABRtab(n,FilsDroit(a), tab);
        }
}

void triTab(int n, int *tab){ // n est la taille du tableau
        Arbre a;
        int i;
        a=initArbre();
        for (i=0; i<n; i++) {
                insertEltArbreRech(&a, tab[i]);
        }
        infixeABRtab(0,a, tab);
        for (i=0; i<10; i++) {
                printf("%i\n", tab[i]);
        }      
        suppArbre(a);
}

Arbre ppnArbre(Arbre a){
        Arbre fig;
        fig=FilsGauche(a);
        if (videArbre(a)) {
                return a;
        }
        else {
                return ppnArbre(fig);
        }
}


Arbre suppRacine(Arbre a){
        Arbre aa, fig, fid;
        fig=FilsGauche(a);
        fid=FilsDroit(a);
        aa=a;
        if (videArbre(fid)) {
                a=fig;
        }
        else {
                a=fid;
                Arbre ppnd;
                ppnd=ppnArbre(fid);
                ppnd->fg=fig;
        }
        free(aa);
        return a;
}
int main(){
        int i;
        int tab[10]={1,6,3,23,2,45,66,32,5,7};
        Arbre a;
        a=initArbre();
        triTab(10,tab);
        for (i=0; i<10; i++) {
                insertEltArbreRech(&a, tab[i]);
                }
        }
}