Advertisement
juanjo12x

Perimetro_Arbol

Jun 15th, 2014
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nodo{
  5.     int valor;
  6.     struct nodo* ptrHI;
  7.     struct nodo* ptrHD;
  8. } TNodo;
  9.  
  10. typedef struct nodo6{
  11.     int valor;
  12.     struct nodo6* sig;
  13. }TLista;
  14.  
  15. typedef struct nodo2{
  16.     TNodo* valor;
  17.     struct nodo2* sig;
  18. }TCola;
  19.  
  20.  
  21. void crear_arbol(TNodo ** ptrRaiz);
  22. void inserta_nodo(TNodo **ptrRaiz, int valor);
  23. void inserta_final(TLista **, int);
  24. void ladoIzquierda(TNodo *, TLista**);
  25. void Perimetro(TNodo*);
  26.  
  27.  
  28. void crear_arbol(TNodo ** ptrRaiz){
  29.     *ptrRaiz = NULL;
  30. }
  31.  
  32. void inserta_nodo(TNodo **ptrRaiz, int valor){
  33.     TNodo *ptrHoja, *ptrRecorrido, *ptrPadre;
  34.     ptrHoja = (TNodo*)malloc(sizeof(TNodo));
  35.     ptrHoja->valor = valor;
  36.     ptrHoja->ptrHI=ptrHoja->ptrHD=NULL;
  37.    
  38.     if(*ptrRaiz){
  39.         ptrRecorrido = *ptrRaiz;
  40.         ptrPadre = NULL;
  41.        
  42.         while (ptrRecorrido){
  43.             ptrPadre = ptrRecorrido;
  44.             if (ptrRecorrido->valor > valor)
  45.                 ptrRecorrido = ptrRecorrido->ptrHI;
  46.             else
  47.                 ptrRecorrido = ptrRecorrido->ptrHD;                  
  48.         }
  49.         if (ptrPadre->valor > valor)
  50.             ptrPadre->ptrHI = ptrHoja;
  51.         else
  52.             ptrPadre->ptrHD = ptrHoja;
  53.     }
  54.     else{
  55.      *ptrRaiz = ptrHoja;  
  56.     }          
  57. }
  58. void inserta_final(TLista **ptrListaSE, int valor){
  59.     TLista *ptrNuevo, *ptrUltimo, *ptrRecorrido;
  60.     ptrNuevo = (TLista*)malloc(sizeof(TLista));
  61.     ptrNuevo->valor = valor;
  62.     ptrNuevo->sig = NULL;
  63.    
  64.     ptrRecorrido = *ptrListaSE;
  65.     ptrUltimo = NULL;
  66.     while (ptrRecorrido){
  67.         ptrUltimo = ptrRecorrido;
  68.         ptrRecorrido = ptrRecorrido->sig;
  69.     }
  70.    
  71.     if (ptrUltimo)
  72.         ptrUltimo->sig = ptrNuevo;
  73.     else
  74.         (*ptrListaSE) = ptrNuevo;
  75. }
  76. void ponerEnCola(TNodo*nodo, TCola**Cola){ //lo pone al ultimo, no pone nulos
  77.     if(nodo){
  78.         TCola*nuevo=(TCola*)malloc(sizeof(TCola));
  79.         nuevo->valor=nodo;
  80.         nuevo->sig=NULL;
  81.         TCola*recor=*Cola;
  82.         TCola*ant=NULL;
  83.         while(recor){
  84.             ant=recor;
  85.             recor=recor->sig;
  86.         }
  87.         if(ant==NULL){
  88.             *Cola=nuevo;
  89.         }else{
  90.             ant->sig=nuevo;
  91.         }
  92.     }
  93. }
  94.  
  95. TNodo* sacarDeCola(TCola**Cola){ //saca el del primero
  96.     if(*Cola){
  97.         TNodo*nuevo;
  98.         TCola*sacar=*Cola;
  99.         nuevo=sacar->valor;
  100.         *Cola=(*Cola)->sig;
  101.         free(sacar);
  102.         return nuevo;
  103.     }
  104. }
  105. /*procedimiento para recorrer todo los hijos izquierdos del arbol y insertarlos
  106.  al final de la lista*/
  107. void ladoIzquierdo(TNodo*arbol2,TLista **lista){
  108.     if(arbol2){
  109.         if(arbol2->ptrHI){
  110.             TNodo*padre=arbol2;
  111.             TNodo* recor=arbol2->ptrHI;
  112.             while(recor){
  113.                 inserta_final(&(*lista),padre->valor);
  114.                 padre=recor;
  115.                 recor=recor->ptrHI;
  116.                 if (recor == NULL)
  117.                     recor=padre->ptrHD;
  118.             }
  119.         }
  120.     }
  121. }
  122.  
  123. void ladoDerecho(TNodo*arbol2,TLista **lista){
  124.     if(arbol2){
  125.         if(arbol2->ptrHD && arbol2->ptrHD->ptrHD){
  126.             TNodo*padre=arbol2->ptrHD;
  127.             TNodo* recor=arbol2->ptrHD->ptrHD;
  128.             while(recor){
  129.                 inserta_final(&(*lista),padre->valor);
  130.                 padre=recor;
  131.                 recor=recor->ptrHD;
  132.                 if (recor == NULL)
  133.                     recor=padre->ptrHI;                
  134.             }
  135.         }
  136.     }
  137. }
  138. void HijosArbol(TNodo*arbol2,TLista **lista){ //las hojas del arbol
  139.     if (arbol2){
  140.         TCola*cola=NULL;
  141.         ponerEnCola(arbol2,&cola);
  142.         while(cola){
  143.             TNodo*nodo=sacarDeCola(&cola);
  144.             if(nodo->ptrHD==NULL && nodo->ptrHI==NULL)
  145.                  inserta_final(&(*lista),nodo->valor);
  146.             ponerEnCola(nodo->ptrHI,&cola);
  147.             ponerEnCola(nodo->ptrHD,&cola);
  148.         }
  149.     }
  150. }
  151.  
  152.  
  153. void perimetro(TNodo*arbol2){
  154.     TLista *lista=NULL;
  155.     ladoIzquierdo(arbol2,&lista); //aca pondra en la lista el lado izquierdo del arbol, incluido la raiz, pero sin que sea hoja
  156.     HijosArbol(arbol2,&lista);// //aca pondra todas las Hojas del arbol
  157.     ladoDerecho(arbol2,&lista); //aca pondra en la lista el lado derecho del arbol, pero sin la raiz, pero sin que sea hoja
  158.    
  159.    
  160.     /*Procedemos a imprimir el perimetro*/
  161.     TLista *recor=lista;
  162.     while(recor){
  163.         printf("%d-",recor->valor);
  164.         recor=recor->sig;
  165.     }
  166. }
  167.  
  168. int main(int argc, char** argv) {
  169.     TNodo *ptrRaiz;
  170.     crear_arbol(&ptrRaiz);
  171.     inserta_nodo(&ptrRaiz, 4);
  172.     inserta_nodo(&ptrRaiz, 2);
  173.     inserta_nodo(&ptrRaiz, 1);
  174.     inserta_nodo(&ptrRaiz, 6);
  175.     inserta_nodo(&ptrRaiz, 5);
  176.     inserta_nodo(&ptrRaiz, 7);
  177.     perimetro(ptrRaiz);
  178.     return (EXIT_SUCCESS);
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement