Advertisement
Guest User

conjunto.hpp

a guest
May 27th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. #include "Conjunto.h"
  2.  
  3. template <class T>
  4. Conjunto<T>::Nodo::~Nodo() {
  5. if(izq!=NULL){
  6. delete izq;
  7. }
  8. if(der!=NULL){
  9. delete der;
  10. }
  11. }
  12. template <class T>
  13. Conjunto<T>::Conjunto() {
  14. _raiz=NULL;
  15. }
  16.  
  17. template <class T>
  18. Conjunto<T>::~Conjunto() {
  19. if(_raiz!=NULL){
  20. delete _raiz;
  21. }
  22.  
  23. }
  24.  
  25. template <class T>
  26. bool Conjunto<T>::pertenece(const T& clave) const{
  27. Nodo* r=_raiz;
  28. while(r!=NULL && r->valor!=clave){
  29. if(r->valor>clave){
  30. r=r->izq;
  31. } else{
  32. r=r->der;
  33. }
  34. }
  35. return r->valor==clave;
  36. }
  37.  
  38. template <class T>
  39. void Conjunto<T>::insertar(const T& clave) {
  40. Nodo* p=_raiz;
  41. Nodo *n=insertar(_raiz,clave);
  42. Nodo *m= insertar(p,clave);
  43. p=n;
  44. /*Nodo* p= _raiz;
  45. if(pertenece(clave)){
  46. return ;
  47. }
  48. if(p==NULL){
  49. Nodo * n= new Nodo(clave);
  50. p=n;
  51. }else{
  52. if(p->valor>clave){
  53. Nodo * n= new Nodo(clave);
  54. p->der=n;
  55. }else if(p->valor<clave){
  56. Nodo * n= new Nodo(clave);
  57. p->izq=n;
  58. }
  59. }*/
  60. /*Nodo*p=_raiz;
  61. if(p==NULL){
  62. Nodo * n= new Nodo(clave);
  63. _raiz=n;
  64. } else{
  65. while(p!=NULL){
  66. if(p->valor==clave){
  67. break;
  68. } else if(p->valor<clave){
  69. if(p->der==NULL){
  70. Nodo * n= new Nodo(clave);
  71. p->der=n;
  72. break;}
  73. else{
  74. p=p->der;
  75. if(p->valor<clave){
  76. Nodo * n= new Nodo(clave);
  77. p->der=n;} else{
  78. Nodo * n= new Nodo(clave);
  79. p->izq=n;
  80. }
  81. break;
  82. }
  83. } else if(p->valor>clave){
  84. if(p->izq==NULL){
  85. Nodo * n= new Nodo(clave);
  86. p->izq=n;
  87. break;
  88. } else{
  89. Nodo * n= new Nodo(clave);
  90. p->izq->der=n;
  91. break;
  92. }
  93. }
  94. }*/
  95. /*
  96. if(padre(p)->valor<clave){
  97. Nodo * n= new Nodo(clave);
  98. padre(p)->izq=n;
  99. } else{
  100. Nodo* n=new Nodo(clave);
  101. padre(p)->der=n;
  102. }
  103. }*/
  104. }
  105.  
  106. template <class T>
  107. void Conjunto<T>::remover(const T& clave) {
  108. if(pertenece(clave)){
  109. Nodo*q=buscar_Nodo(clave);
  110. //es hoja
  111. if(q->der==NULL && q->izq==NULL){
  112. delete q;
  113. _raiz=NULL;
  114. }//1 hoja
  115. if(q->der!=NULL){
  116. delete q->der;
  117. } else if(q->izq!=NULL){
  118. delete q->izq;
  119. } //2 hojas
  120. if(q->der!=NULL && q->izq!=NULL){
  121. if(q->der->valor>clave){
  122. Nodo*p=q->der->der;
  123. p->izq=q->izq;
  124. p->der=q->der;
  125. delete q;
  126. } else if((q->izq->valor <clave)){
  127. Nodo*p=q->izq->izq;
  128. p->der =q->der;
  129. p->izq=q->izq;
  130. delete q;
  131. }
  132. }
  133. }
  134. }
  135.  
  136. template <class T>
  137. const T& Conjunto<T>::siguiente(const T& clave) {
  138. assert(false);
  139. }
  140.  
  141. template <class T>
  142. const T& Conjunto<T>::minimo() const {
  143. Nodo*p=_raiz;
  144. return findMinimo(p);
  145. }
  146. template <class T>
  147. T Conjunto<T>::findMinimo(Nodo *raiz)const {
  148. //Caso Base
  149. if(raiz ==NULL){
  150. return NULL;
  151. } else {
  152. T res = raiz->valor;
  153. T lres=NULL;
  154. T rres=NULL;
  155. if(raiz->izq!=NULL) {
  156. lres = findMinimo(raiz->izq);
  157. if (lres < res) {
  158. res = lres;
  159. }
  160. }
  161. if(raiz->der!=NULL) {
  162. rres = findMinimo(raiz->der);
  163. if (rres < res) {
  164. res = rres;
  165. }
  166. }
  167.  
  168.  
  169. return res;
  170. }
  171. }
  172.  
  173. template <class T>
  174. const T& Conjunto<T>::maximo() const {
  175. assert(false);
  176. }
  177.  
  178. template <class T>
  179. unsigned int Conjunto<T>::cardinal() const {
  180. Nodo* r1=_raiz;
  181. Nodo* r2=_raiz;
  182. int i=0;
  183. int j=0;
  184. if(r1!=NULL){
  185. j=1;
  186. }
  187. while(r1!=NULL){
  188. if(r1->izq!=NULL){
  189. if(r1->valor>r1->izq->valor){
  190. r1=r1->izq;
  191. i++;
  192. }} else if(r1->der!=NULL){
  193. r1=r1->der;
  194. i++;
  195. } else{r1=NULL;}
  196. }
  197. while(r2!=NULL){
  198. if(r2->der!=NULL){
  199. if(r2->valor<r2->der->valor){
  200. r2=r2->der;
  201. j++;
  202. }}else if(r2->izq!=NULL){
  203. r2=r2->izq;
  204. j++;
  205. } else{
  206. r2=NULL;}
  207. }
  208. return j+i;
  209. }
  210.  
  211. template <class T>
  212. void Conjunto<T>::mostrar(std::ostream&) const {
  213. assert(false);
  214. }
  215.  
  216. template <typename T>
  217. void Conjunto<T>::limpiar(){
  218. Nodo* p=_raiz;
  219. while(p!=NULL){
  220. p=padre(minimo());
  221. if(p->der!=NULL){
  222. delete p->der;}
  223. if(p->izq!=NULL) {
  224. delete p->izq;
  225. }
  226. delete p;
  227. }
  228. _raiz=NULL;
  229.  
  230. }
  231.  
  232. template <typename T>
  233. typename Conjunto<T>::Nodo* Conjunto<T>::buscar_Nodo(const T k){
  234. Nodo* r=_raiz;
  235. if(k==NULL){
  236. return NULL;
  237. } else{
  238. while(r!=NULL){
  239. if(r->valor!=k){
  240. if(r->valor>k){
  241. r=r->izq;
  242. } else{
  243. r=r->der;
  244. }
  245. } else{
  246. return r;
  247. }
  248. }}
  249. return r;
  250. }
  251. // C function to search a given key in a given BST
  252. template <typename T>
  253. typename Conjunto<T>::Nodo* Conjunto<T>:: search(Nodo* raiz, int key) {
  254. // Base Cases: root is null or key is present at root
  255. if (raiz == NULL || raiz->valor == key)
  256. return raiz;
  257.  
  258. // Key is greater than root's key
  259. if (_raiz->valor < key)
  260. return search(raiz->der, key);
  261.  
  262. // Key is smaller than root's key
  263. return search(raiz->izq, key);
  264. }
  265. template <typename T>
  266. typename Conjunto<T>::Nodo* Conjunto<T>:: CrearNodo( const int clave) {
  267. {
  268. Nodo* n=new Nodo(clave);
  269. /*n->valor = clave;
  270. n->izq = NULL;
  271. n->der = NULL;*/
  272. return n;
  273. }
  274. }
  275.  
  276. template <typename T>
  277. typename Conjunto<T>::Nodo* Conjunto<T>:: insertar(Nodo *nodo, int key) {
  278. /* If the tree is empty, return a new node */
  279. if (nodo == NULL){
  280. Nodo*n= new Nodo(key);
  281. return n;
  282. }
  283. /* Otherwise, recur down the tree */
  284. if (key < nodo->valor)
  285. nodo->izq = insertar(nodo->izq, key);
  286. else if (key > nodo->valor)
  287. nodo->der = insertar(nodo->der, key);
  288.  
  289. /* return the (unchanged) node pointer */
  290. return nodo;
  291. }
  292. /*
  293. template <typename T>
  294. void Conjunto<T>::inorder(Nodo *raiz){
  295. if (raiz != NULL)
  296. {
  297. inorder(raiz->izq);
  298. inorder(raiz->der);
  299. }
  300. }
  301. */
  302. /*
  303. template <typename T>
  304. typename Conjunto<T>::Nodo* Conjunto<T>::buscar_valor_Nodo(const T& k){
  305. Nodo* r=_raiz;
  306. while(r!=NULL && r->valor!=k){
  307. if(r->valor>k){
  308. r=r->izq;
  309. } else{
  310. r=r->der;
  311. }
  312. }
  313. return r->valor;
  314. }
  315. */
  316. template <typename T>
  317. typename Conjunto<T>::Nodo * Conjunto<T>:: padre(Nodo* q)const {
  318. Nodo* p=_raiz;
  319. Nodo* papa=0;
  320.  
  321. while(p!=NULL){
  322. if(p->valor>q->valor){
  323. if(p->izq!=NULL){
  324. papa=p;
  325. p=p->izq;
  326. }
  327. } else if(p->valor<q->valor){
  328. if(p->der!=NULL){
  329. papa=p;
  330. p=p->der;
  331. }
  332. }
  333. }
  334.  
  335. return papa;
  336. }
  337. /*
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement