Advertisement
pmanriquez93

TAD ABB + Busquedas

Jul 3rd, 2014
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.95 KB | None | 0 0
  1. /* CABECERA */
  2.  
  3. #ifndef ARBOLES_H
  4. #define ARBOLES_H
  5.  
  6. typedef int TElementoArbol;
  7.  
  8. typedef struct nodo{
  9.     TElementoArbol elem;
  10.     struct nodo* hijoIzq;
  11.     struct nodo* hijoDer;
  12. }TNodo;
  13.  
  14. typedef struct{
  15.     TNodo *raiz;    
  16. }TArbol;
  17.  
  18. void crearArbol(TArbol *);
  19.  
  20. int esArbolVacio(TArbol*);
  21.  
  22. void imprimirArbol(TArbol*, int);
  23.  
  24. void preOrden(TNodo*);
  25. void inOrden(TNodo*);
  26. void postOrden(TNodo*);
  27.  
  28. //void alturaArbol(TArbol*);
  29. //void buscarElemento(TArbol*);
  30. //void buscarPadreElemento(TArbol*);
  31.  
  32. void insertarElem(TArbol*,TElementoArbol);
  33. void insertarElemUtil(TNodo**,TNodo*);
  34.  
  35. void eliminarElem(TArbol*,TElementoArbol);
  36. void eliminarElemUtil(TNodo**,TElementoArbol);
  37. TElementoArbol buscarMax(TNodo*);
  38.  
  39.  
  40. typedef TNodo* TElemento;
  41.  
  42. /* PILA */
  43.  
  44. typedef struct nodoPila{
  45.     TElemento elem;
  46.     struct nodoPila* ptrSig;
  47. }TNodoPila;
  48.  
  49. typedef struct{
  50.     TNodoPila *cima;
  51. }TPila;
  52.  
  53. void crearPila(TPila *);
  54.  
  55. void apilar(TPila *, TElemento);
  56.  
  57. void desapilar(TPila *);
  58.  
  59. TElemento cima(TPila *);
  60.  
  61. int esVaciaPila(TPila *);
  62.  
  63. void imprimirPila(TPila *);
  64.  
  65.  
  66.  
  67.  
  68.  
  69. /* COLA */
  70.  
  71. typedef struct nodoCola{
  72.     TElemento elem;
  73.     struct nodoCola* ptrSig;
  74. }TNodoCola;
  75.  
  76. typedef struct {
  77.     TNodoCola *primero;
  78.     TNodoCola *ultimo;
  79. }TCola;
  80.  
  81. void crearCola(TCola *);
  82.  
  83. void encolar(TCola *, TElemento);
  84.  
  85. void desencolar(TCola *);
  86.  
  87. TElemento primero(TCola *);
  88.  
  89. int esVaciaCola(TCola *);
  90.  
  91. void imprimirCola(TCola *);
  92.  
  93.  
  94. void recorridoEnProfundidad(TArbol*);
  95. void recorridoEnAmplitud(TArbol*);
  96.  
  97.  
  98. #endif  /* ARBOLES_H */
  99.  
  100.  
  101.  
  102.  
  103. /* IMPLEMENTACION */
  104.  
  105. #include <stdio.h>
  106. #include <stdlib.h>
  107. #include "arboles.h"
  108.  
  109. void crearArbol(TArbol *arbol){
  110.     arbol->raiz = NULL;
  111. }
  112.  
  113. int esArbolVacio(TArbol*arbol){
  114.     if (arbol->raiz == NULL)
  115.         return 1;
  116.     else
  117.         return 0;
  118. }
  119.  
  120. void imprimirArbol(TArbol*arbol,int op){
  121.     if (op == 1)
  122.         preOrden(arbol->raiz);
  123.     else if (op == 2)
  124.         inOrden(arbol->raiz);
  125.     else if (op == 3)
  126.         postOrden(arbol->raiz);
  127.     printf("\n");
  128. }
  129.  
  130. void preOrden(TNodo*raiz){
  131.     if (raiz != NULL){
  132.         printf("%3d",raiz->elem);
  133.         preOrden(raiz->hijoIzq);
  134.         preOrden(raiz->hijoDer);  
  135.     }
  136. }
  137.  
  138. void inOrden(TNodo*raiz){
  139.     if (raiz != NULL){
  140.         inOrden(raiz->hijoIzq);
  141.         printf("%3d",raiz->elem);
  142.         inOrden(raiz->hijoDer);
  143.     }  
  144. }
  145.  
  146. void postOrden(TNodo*raiz){
  147.     if (raiz != NULL){
  148.         postOrden(raiz->hijoIzq);
  149.         postOrden(raiz->hijoDer);
  150.         printf("%3d",raiz->elem);
  151.     }
  152. }
  153.  
  154. //void alturaArbol(TArbol*);
  155. //void buscarElemento(TArbol*);
  156. //void buscarPadreElemento(TArbol*);
  157.  
  158.  
  159. void insertarElem(TArbol *arbol,TElementoArbol elem){
  160.     TNodo *ptrNuevo;
  161.     ptrNuevo = (TNodo*)malloc(sizeof(TNodo));
  162.    
  163.     ptrNuevo->elem = elem;
  164.     ptrNuevo->hijoDer = NULL;
  165.     ptrNuevo->hijoIzq = NULL;
  166.    
  167.     insertarElemUtil(&arbol->raiz,ptrNuevo);  
  168. }
  169.  
  170. void insertarElemUtil(TNodo **raiz,TNodo *nuevoNodo){
  171.     if (*raiz == NULL)
  172.         *raiz = nuevoNodo;
  173.     else if (nuevoNodo->elem > (*raiz)->elem)
  174.         insertarElemUtil(&(*raiz)->hijoDer,nuevoNodo);
  175.     else if (nuevoNodo->elem < (*raiz)-> elem)
  176.         insertarElemUtil(&(*raiz)->hijoIzq,nuevoNodo);    
  177. }
  178.  
  179.  
  180. void eliminarElem(TArbol*arbol,TElementoArbol elem){
  181.     if (arbol->raiz == NULL)
  182.         printf("No se puede eliminar de un arbol vacio\n");
  183.     else
  184.         eliminarElemUtil(&arbol->raiz,elem);    
  185. }
  186.  
  187. void eliminarElemUtil(TNodo **raiz, TElementoArbol elem){
  188.     if (elem == (*raiz)->elem){
  189.         if((*raiz)->hijoDer == NULL && (*raiz)->hijoIzq == NULL)
  190.             (*raiz) = NULL;
  191.         else if ((*raiz)->hijoDer != NULL && (*raiz)->hijoIzq != NULL){
  192.             TElementoArbol elemMax;
  193.             elemMax = buscarMax((*raiz));
  194.             eliminarElemUtil(&(*raiz),elemMax);
  195.             (*raiz)->elem = elemMax;            
  196.         }
  197.         else{
  198.             TNodo *ptrEliminar;
  199.             if ((*raiz)->hijoIzq != NULL){
  200.                 ptrEliminar = (*raiz)->hijoIzq;
  201.                 (*raiz)->elem = (*raiz)->hijoIzq->elem;                                
  202.                 free(ptrEliminar);
  203.             }
  204.             else{
  205.                 ptrEliminar = (*raiz)->hijoDer;
  206.                 (*raiz)->elem = (*raiz)->hijoDer->elem;
  207.                 free(ptrEliminar);
  208.             }  
  209.         }          
  210.     }
  211.     else if (elem > (*raiz)->elem)
  212.         eliminarElemUtil(&(*raiz)->hijoDer,elem);
  213.     else if (elem < (*raiz)->elem)
  214.         eliminarElemUtil(&(*raiz)->hijoIzq,elem);
  215.     else if (*raiz == NULL)
  216.         printf("No se encuentra el elemento");
  217. }
  218.  
  219. TElementoArbol buscarMax(TNodo *raiz){
  220.     TNodo *ptrRec;
  221.     ptrRec = raiz->hijoIzq;
  222.     while (ptrRec->hijoDer != NULL)
  223.         ptrRec = ptrRec->hijoDer;
  224.     return ptrRec->elem;
  225. }
  226.  
  227.  
  228. void recorridoEnProfundidad(TArbol*arbol){
  229.     TPila pila;
  230.     crearPila(&pila);
  231.     TNodo* ptrArbol;
  232.     ptrArbol = arbol->raiz;
  233.    
  234.     apilar(&pila,ptrArbol);
  235.     while(!esVaciaPila(&pila)){
  236.         TNodo * auxArbol;
  237.         auxArbol = cima(&pila);
  238.         printf("%3d",auxArbol->elem);
  239.         desapilar(&pila);
  240.         if (auxArbol->hijoDer != NULL)
  241.             apilar(&pila,auxArbol->hijoDer);
  242.         if (auxArbol->hijoIzq != NULL)
  243.             apilar(&pila,auxArbol->hijoIzq);
  244.     }
  245.     printf("\n");
  246. }
  247.  
  248. void recorridoEnAmplitud(TArbol*arbol){
  249.     TCola cola;
  250.     crearCola(&cola);
  251.     TNodo* ptrArbol;
  252.     ptrArbol = arbol->raiz;
  253.    
  254.     encolar(&cola,ptrArbol);
  255.     while(!esVaciaCola(&cola)){
  256.         TNodo *auxArbol;
  257.         auxArbol = primero(&cola);
  258.         printf("%3d",auxArbol->elem);
  259.         desencolar(&cola);
  260.         if (auxArbol->hijoIzq != NULL)
  261.             encolar(&cola,auxArbol->hijoIzq);
  262.         if (auxArbol->hijoDer != NULL)
  263.             encolar(&cola,auxArbol->hijoDer);  
  264.     }
  265.     printf("\n");
  266. }
  267.  
  268.  
  269.  
  270. /* PILA */
  271.  
  272. void crearPila(TPila *pila){
  273.     pila->cima = NULL;    
  274. }
  275.  
  276. void apilar(TPila *pila, TElemento elem){
  277.     TNodoPila *ptrNuevo;
  278.     ptrNuevo = (TNodoPila*)malloc(sizeof(TNodoPila));
  279.    
  280.     ptrNuevo->elem = elem;
  281.     ptrNuevo->ptrSig = NULL;
  282.    
  283.     if (pila->cima == NULL){
  284.         pila->cima = ptrNuevo;
  285.     }else{
  286.         ptrNuevo->ptrSig = pila->cima;
  287.         pila->cima = ptrNuevo;
  288.     }
  289. }
  290.  
  291. void desapilar(TPila *pila){
  292.     if (pila->cima != NULL){
  293.         TNodoPila *ptrEliminar;
  294.         ptrEliminar = pila->cima;
  295.         pila->cima = pila->cima->ptrSig;        
  296.         free(ptrEliminar);
  297.     }else{
  298.         printf("No se puede desapilar de una pila vacia\n");
  299.     }    
  300. }
  301.  
  302. TElemento cima(TPila *pila){
  303.     if (pila->cima != NULL){
  304.         return(pila->cima->elem);        
  305.     }else{
  306.         printf("No hay cima en una pila vacia\n");
  307.     }    
  308. }
  309.  
  310. int esVaciaPila(TPila *pila){
  311.     return (pila->cima == NULL);    
  312. }
  313.  
  314. void imprimirPila(TPila *pila){
  315.     TNodoPila *ptrRec;  
  316.     ptrRec = pila->cima;
  317.    
  318.     while (ptrRec != NULL){
  319.         printf(" %d ",ptrRec->elem);
  320.         ptrRec = ptrRec->ptrSig;
  321.     }
  322.     printf("NULL\n");
  323. }
  324.  
  325.  
  326.  
  327.  
  328. /* COLA */
  329.  
  330. void crearCola(TCola *cola){
  331.     cola->primero = NULL;
  332.     cola->ultimo = NULL;    
  333. }
  334.  
  335. void encolar(TCola *cola, TElemento elem){
  336.     TNodoCola *ptrNuevo;
  337.    
  338.     ptrNuevo = (TNodoCola *)malloc(sizeof(TNodoCola));
  339.     ptrNuevo->elem = elem;
  340.     ptrNuevo->ptrSig = NULL;
  341.    
  342.     if (cola->primero == NULL){
  343.         cola->primero = ptrNuevo;
  344.         cola->ultimo = ptrNuevo;
  345.     }else{
  346.         cola->ultimo->ptrSig = ptrNuevo;
  347.         cola->ultimo = ptrNuevo;    
  348.     }
  349.    
  350. }
  351.  
  352. void desencolar(TCola *cola){
  353.     if (cola->primero != NULL){
  354.         TNodoCola *ptrEliminar;
  355.         ptrEliminar = cola->primero;
  356.         cola->primero = cola->primero->ptrSig;
  357.         free(ptrEliminar);
  358.     }else{
  359.         printf("No se puede desencolar en una cola vacia\n");
  360.     }  
  361. }
  362.  
  363. TElemento primero(TCola *cola){
  364.     if (cola->primero != NULL){
  365.         return (cola->primero->elem);                
  366.     }else{
  367.         printf("No hay primera en una cola vacia\n");      
  368.     }
  369. }
  370.  
  371. int esVaciaCola(TCola *cola){
  372.     return (cola->primero == NULL);    
  373. }
  374.  
  375.  
  376. void imprimirCola(TCola *cola){
  377.     TNodoCola *ptrRec;  
  378.     ptrRec = cola->primero;
  379.    
  380.     while (ptrRec != NULL){
  381.         printf(" %d ",ptrRec->elem);
  382.         ptrRec = ptrRec->ptrSig;
  383.     }
  384.     printf("NULL\n");
  385. }
  386.  
  387.  
  388.  
  389.  
  390. /* MAIN */
  391.  
  392. #include <stdio.h>
  393. #include <stdlib.h>
  394. #include "arboles.h"
  395.  
  396. int main(int argc, char** argv) {
  397.     TArbol arbol;
  398.    
  399.     crearArbol(&arbol);
  400.    
  401.     insertarElem(&arbol,20);
  402.     insertarElem(&arbol,10);
  403.     insertarElem(&arbol,5);
  404.     insertarElem(&arbol,30);
  405.     insertarElem(&arbol,40);
  406.     insertarElem(&arbol,50);
  407.     insertarElem(&arbol,12);
  408.     insertarElem(&arbol,38);
  409.    
  410.     imprimirArbol(&arbol,1);
  411.    
  412.     eliminarElem(&arbol,5);
  413.     imprimirArbol(&arbol,1);
  414.  
  415.    
  416.     recorridoEnProfundidad(&arbol);
  417.     recorridoEnAmplitud(&arbol);
  418.  
  419.     return (EXIT_SUCCESS);
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement