Advertisement
Baobab_Airline

Untitled

Nov 15th, 2019
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.02 KB | None | 0 0
  1. /************************************************************************/
  2. /* Auteur : S. Gueye */
  3. /* TP : Arbres Binaires de Recherche */
  4. /* Date dernière maj : 05/11/2019 */
  5. /************************************************************************/
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9. #include "ABR.h"
  10.  
  11. using namespace std;
  12.  
  13. /****************************************/
  14. /* Objectif : Constructeur d'un noeud dont les fils sont NULL
  15. /* Entrées : entier x
  16. /* Complexité : 0(1)
  17. /****************************************/
  18. noeud::noeud(int x)
  19. {
  20. cle = x;
  21. fg = fd = pere = NULL;
  22. }
  23.  
  24.  
  25. /****************************************/
  26. /* Objectif : Destructeur d'un noeud
  27. /****************************************/
  28. noeud::~noeud()
  29. {
  30. if(fg)
  31. delete(fg);
  32. if(fd)
  33. delete(fd);
  34. }
  35.  
  36. /****************************************/
  37. /* Objectif : Constructeur d'un ABR
  38. /****************************************/
  39. ABR::ABR()
  40. {
  41. r = NULL;
  42. }
  43.  
  44.  
  45. /****************************************/
  46. /* Objectif : Constructeur d'un ABR
  47. /****************************************/
  48. ABR::ABR(char* filename)
  49. {
  50. r = NULL;
  51. ifstream file(filename);
  52. int n,tmp,cpt = 0;
  53.  
  54. file >> n;
  55. for(int i = 0; i < n ; i++){
  56. file >> tmp;
  57. if(insertion(tmp))
  58. cpt++;
  59. }
  60.  
  61. cout << "Nombre d'éléments insérés = " << cpt << endl;
  62. file >> e;
  63. infixe(r);
  64. cout << endl;
  65. file.close();
  66. }
  67.  
  68.  
  69.  
  70. /****************************************/
  71. /* Objectif : Destructeur d'un ABR
  72. /****************************************/
  73. ABR::~ABR()
  74. {
  75. if(r)
  76. delete(r);
  77. }
  78.  
  79. /****************************************/
  80. /* Objectif : Accesseur à la racine r
  81. /****************************************/
  82. noeud* ABR::root()
  83. {
  84. return(r);
  85. }
  86.  
  87. /****************************************/
  88. /* Objectif : Accès à e (un élément qui sera recherché)
  89. /****************************************/
  90. int ABR::gete()
  91. {
  92. return(e);
  93. }
  94.  
  95. /****************************************/
  96. /* Objectif : Parcours infixe
  97. /****************************************/
  98. void ABR::infixe(noeud* x)
  99. {
  100. if(x){
  101. infixe(x->fg);
  102. cout << " " << x->cle;
  103. infixe(x->fd);
  104. }
  105. }
  106.  
  107. /****************************************/
  108. /* Objectif : Recherche de la valeur cle.
  109. La méthode retourne l'adresse de "cle" s'il existe
  110. ou NULL sinon.
  111. /****************************************/
  112. noeud* ABR::recherche(int cle)
  113. {
  114. // !!!!! A FAIRE !!!!! //
  115. noeud* x = r;
  116. while(x!=NULL && cle!=x->cle){
  117. if(cle < x->cle){
  118. x = x->fg;
  119. }
  120. else{
  121. x = x->fd;
  122. }
  123. }
  124. return(x);
  125.  
  126. }
  127.  
  128. /****************************************/
  129. /* Objectif : Insertion de "cle" dans l'arbre
  130. /* "cle" étant un identifiant unique, il faudra vérifier qu'il
  131. n'existe pas déjà dans l'arbre, auquel cas il ne faudra pas l'insérer.
  132.  
  133. La méthode doit renvoyer "vrai" si l'insertion a pu être faite
  134. et "faux" sinon.
  135. /****************************************/
  136. bool ABR::insertion(int cle)
  137. {
  138. // !!!!! A FAIRE !!!!! //
  139. noeud* x = r;
  140. if(x == NULL){
  141. r = new noeud (cle);
  142. return(true);
  143. }
  144. while(1){
  145. if(cle == x->cle){
  146. return(false);
  147. }
  148. if(cle< x->cle){
  149. if(x->fg == NULL){
  150. x->fg = new noeud (cle);
  151. x->fg->pere = x;
  152. return(true);
  153. }
  154. else{
  155. x = x->fg;
  156. }
  157. }
  158. else{
  159. if(x->fd == NULL){
  160. x->fd = new noeud (cle);
  161. x->fd->pere = x;
  162. return(true);
  163. }
  164. else{
  165. x = x->fd;
  166. }
  167. }
  168. }
  169. }
  170.  
  171.  
  172. /****************************************/
  173. /* Objectif : Recherche de l'adresse du noeud
  174. de plus petite cle dans l'arbre de racine x
  175. /****************************************/
  176. noeud* ABR::minimum(noeud* x)
  177. {
  178. // !!!!! A FAIRE !!!!! //
  179. noeud* tmp = x;
  180. while(tmp->fg!=NULL){
  181. tmp=tmp->fg;
  182. }
  183. return(tmp);
  184. }
  185.  
  186. /****************************************/
  187. /* Objectif : Recherche de l'adresse du noeud
  188. de plus grande cle dans l'arbre de racine x
  189. /****************************************/
  190. noeud* ABR::maximum(noeud* x)
  191. {
  192. noeud* tmp = x;
  193. while(tmp->fd!=NULL){
  194. tmp=tmp->fd;
  195. }
  196. return(tmp);
  197. }
  198.  
  199.  
  200. /****************************************/
  201. /* Objectif : Recherche de l'adresse du noeud
  202. predecesseur de x dans l'arbre de racine r
  203. (l'attribut "r" de l'objet appelant).
  204. /****************************************/
  205. noeud* ABR::predecesseur(noeud* x)
  206. {
  207. // !!!!! A FAIRE !!!!! //
  208. noeud* tmp = x;
  209. if(tmp->fg!=NULL)
  210. {
  211. return(maximum(tmp->fg));
  212. }
  213. noeud* y=tmp->pere;
  214. while((y!=NULL)&&(tmp==y->fg))
  215. {
  216. tmp=y;
  217. y=y->pere;
  218. }
  219. return(y);
  220. }
  221.  
  222. /****************************************/
  223. /* Objectif : Recherche de l'adresse du noeud
  224. predecesseur de x dans l'arbre de racine r
  225. (l'attribut "r" de l'objet appelant).
  226. /****************************************/
  227. noeud* ABR::successeur(noeud* x)
  228. {
  229. // !!!!! A FAIRE !!!!! //
  230. noeud* tmp = x;
  231. if(tmp->fd!=NULL)
  232. {
  233. return(minimum(tmp->fd));
  234. }
  235. noeud* y=tmp->pere;
  236. while((y!=NULL)&&(tmp==y->fd))
  237. {
  238. tmp=y;
  239. y=y->pere;
  240. }
  241. return(y);
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement