Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.65 KB | None | 0 0
  1. /************************************************************************/
  2. /* Auteur : S. Gueye */
  3. /* TP : Arbres Binaires de Recherche */
  4. /* Date dernière maj : 18/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. noeud* res = NULL;
  115. noeud* x = r;
  116. bool trouve = false;
  117. while(x && (!trouve)){
  118. if(x->cle < cle)
  119. x = x->fd;
  120. else
  121. if(x->cle > cle)
  122. x = x->fg;
  123. else
  124. trouve = true;
  125. }
  126.  
  127. return(x);
  128. }
  129.  
  130. /****************************************/
  131. /* Objectif : Insertion de "cle" dans l'arbre
  132. /* "cle" étant un identifiant unique, il faudra vérifier qu'il
  133. n'existe pas déjà dans l'arbre, auquel cas il ne faudra pas l'insérer.
  134.  
  135. La méthode doit renvoyer "vrai" si l'insertion a pu être faite
  136. et "faux" sinon.
  137. /****************************************/
  138. bool ABR::insertion(int cle)
  139. {
  140. noeud * y;
  141. noeud* x = r;
  142. noeud* pere = NULL;
  143. bool existe = false;
  144.  
  145. while(x != NULL){
  146.  
  147. pere = x;
  148. if(cle < x->cle)
  149. x = x->fg;
  150. else
  151. if(cle > x->cle)
  152. x = x->fd;
  153. else{
  154. existe = true;
  155. x = NULL;
  156. }
  157. }
  158.  
  159. if(! existe){
  160. y = new noeud(cle);
  161.  
  162. if(pere == NULL)
  163. r = y;
  164. else{
  165. y->pere = pere;
  166. if(cle < pere->cle)
  167. pere->fg = y;
  168. else
  169. pere->fd = y;
  170. }
  171. }
  172.  
  173. return(!existe);
  174. }
  175.  
  176.  
  177. /****************************************/
  178. /* Objectif : Recherche de l'adresse du noeud
  179. de plus petite cle dans l'arbre de racine x
  180. /****************************************/
  181. noeud* ABR::minimum(noeud* x)
  182. {
  183. // !!!!! A recopier du précédent TP !!!!! //
  184. noeud* y = x;
  185. if (r == NULL)
  186. {
  187. return (NULL);
  188. }
  189. else
  190. {
  191. while (y->fg != NULL)
  192. {
  193. y = y->fg;
  194. }
  195. return(y);
  196. }
  197. }
  198.  
  199. /****************************************/
  200. /* Objectif : Recherche de l'adresse du noeud
  201. de plus grande cle dans l'arbre de racine x
  202. /****************************************/
  203. noeud* ABR::maximum(noeud* x)
  204. {
  205. // !!!!! A recopier du précédent TP !!!!! //
  206. noeud* y = x;
  207.  
  208. if (r == NULL)
  209. {
  210. return (NULL);
  211. }
  212. else
  213. {
  214. while (y->fd != NULL)
  215. {
  216. y = y->fd;
  217. }
  218. return(y);
  219. }
  220. }
  221.  
  222.  
  223. /****************************************/
  224. /* Objectif : Recherche de l'adresse du noeud
  225. predecesseur de x dans l'arbre de racine r
  226. (l'attribut "r" de l'objet appelant).
  227. /****************************************/
  228. noeud* ABR::predecesseur(noeud* x)
  229. {
  230. // !!!!! A recopier du précédent TP !!!!! //
  231. noeud* tmp = x;
  232. if (tmp->fg != NULL)
  233. {
  234. return (maximum(tmp->fg));
  235. }
  236. noeud *y = tmp->pere;
  237. while (y != NULL and tmp == y->fg)
  238. {
  239. tmp = y;
  240. y = y->pere;
  241. }
  242. return(y);
  243. }
  244.  
  245. /****************************************/
  246. /* Objectif : Recherche de l'adresse du noeud
  247. predecesseur de x dans l'arbre de racine r
  248. (l'attribut "r" de l'objet appelant).
  249. /****************************************/
  250. noeud* ABR::successeur(noeud* x)
  251. {
  252. // !!!!! A recopier du précédent TP !!!!! //
  253. noeud* tmp = x;
  254.  
  255. if (tmp->fd != NULL)
  256. {
  257. return (minimum(tmp->fd));
  258. }
  259. noeud *y = tmp->pere;
  260. while (y != NULL and tmp == y->fd)
  261. {
  262. tmp = y;
  263. y = y->pere;
  264. }
  265. return(y);
  266. }
  267.  
  268. /****************************************/
  269. /* Objectif : Deplacer le sous-arbre de racine v
  270. à l'emplacement du sous-arbre de racine u.
  271. u est supposé non nul
  272. /****************************************/
  273. void ABR::deplacer(noeud* u, noeud* v)
  274. {
  275. // !!!!! A FAIRE !!!!! //
  276. if (u->pere == NULL)
  277. {
  278. r = v;
  279. }
  280. else
  281. {
  282. if (u == u->pere->fg)
  283. {
  284. u->pere->fg = v;
  285. }
  286. else
  287. {
  288. u->pere->fd = v;
  289. }
  290. }
  291. if (v != NULL)
  292. {
  293. v->pere = u->pere;
  294. }
  295. }
  296.  
  297. /****************************************/
  298. /* Objectif : Suppression du noeud x supposé existant
  299. dans l'arbre
  300. /****************************************/
  301. void ABR::suppression(noeud* x)
  302. {
  303. // !!!!! A FAIRE !!!!! //
  304. if (x->fg == NULL)
  305. {
  306. deplacer(x, x->fd);
  307. }
  308. else
  309. {
  310. if (x->fd == NULL)
  311. {
  312. deplacer(x, x->fg);
  313. }
  314. else
  315. {
  316. noeud* y = successeur(x);
  317. if (y->pere != x)
  318. {
  319. deplacer(y, y->fd);
  320. y->fd = x->fd;
  321. y->fd->pere = y;
  322. }
  323. deplacer(x, y);
  324. y->fg = x->fg;
  325. y->fg->pere = y;
  326. }
  327. }
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement