Bonjour toutes et tous
Si l'ajout et l'affichage d'un arbre(ABR) est facile,par contre la suppression est très difficile !!
bon j'ai essaye de le faire et mais je n'arrive pas à avancer.
pour supprimer un nœud dans un ABR, 3 conditions sont possible:
*si le nœud qui contient la valeur ,est une feuille donc la suppression est facile =>free
*si le nœud possède un seul fils,alors la suppression est équivalent à celle d'une liste chainée(et c'est là où je bloque )
*si le nœud possède 2 fils alors on lui remplace par son prédécesseur et ce dernier va être libérer.

voici mon essai:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
                 /*PROGRAMME DE REVISION DE ABR (COURS)*/
/*DEFINITION DE L'ARBRE*/
typedef struct noeud
{
        int info;
        struct noeud* sag;
        struct noeud* sad;
}noeud;
void creation(noeud **r,int x)//creation d'un noeud 
{
     if((*r)==NULL)
     {
                   (*r)=(noeud*)malloc(sizeof(noeud));
                   (*r)->info=x;
                   (*r)->sag=NULL;
                   (*r)->sad=NULL; 
     }
     else
     {
                   if(x>(*r)->info)
                             creation(&((*r)->sad),x);      
                   else
                             if(x<(*r)->info)
                             creation(&((*r)->sag),x); 
                             else
                             printf("la valeur existe deja ");
     }
}
noeud* predecesseur(noeud *r)//la fonction qui permet de retourner l'@ de son predecesseur
{
    if(r->sad!=NULL)
       predecesseur(r->sad);
    else
        return (r);
}  
 
noued* recherche(noeud *r,int x)//C la recherche dichatomique
{
               if(r==NULL)
                          return NULL;/*on est arrivé à la fin et qu'on a pas trouvé x,ou bien l'arbre est vide*/
               if(r->info==x)
                          return r;
               if(r->info>x)/*on va chercher dans la partie gauche*/
                  return         recherche(r->sag,x);
               else
                  return         recherche(r->sad,x);
 
}
int estFeuille(noeud *r)
{
    return(r->sag==NULL&&r->sad==NULL);
 
 
}   
 
 
int main()
{
     noeud *r=NULL;
     int rech;
     creation(&r,5);
     creation(&r,10);
     creation(&r,46);
     creation(&r,6);
     printf("Taper la valeur à chercher \n");
     scanf("%d",&rech);
 
     if(recherche(r,46)==NULL)
                              printf("la valeur n'existe pas");
     else 
     {
          noeud *x=recherche(r,46);/*recupere les le noeud qui porte la valeur chercher */
 
          if(estFeuille(x)==1)//si c'est unr freuille =>free.
                              free(x);
          else 
          {
               if(x->sag!=NULL&&x->sad!=NULL)//s'il posséde 2 fils 
               {
                                                    noeud *p=predecesseur(x);//récupere le predecesseur
                                                    x->info=p->info; //passer l'information
                                                    free(p);//et enfin liberer le predecesseur
               }
               else
               {
                   if(x->sag!=NULL) // il a un seul fils=>gauche
               //C LA où je me bloque !
               }             
          } 
 
 
      }
 
     getch();
     return 0;
}
je serais très reconnaissante si quelqu'un peut m'aider à faire ce qui reste.

a+