Advertisement
juanjo12x

Maxima_Anchura

Jun 15th, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.24 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. void crear_arbol(TNodo ** ptrRaiz);
  21. void inserta_nodo(TNodo **ptrRaiz, int valor);
  22. void inserta_final(TLista **, int);
  23.  
  24. void inserta_final(TLista **ptrListaSE, int valor){
  25.     TLista *ptrNuevo, *ptrUltimo, *ptrRecorrido;
  26.     ptrNuevo = (TLista*)malloc(sizeof(TLista));
  27.     ptrNuevo->valor = valor;
  28.     ptrNuevo->sig = NULL;
  29.    
  30.     ptrRecorrido = *ptrListaSE;
  31.     ptrUltimo = NULL;
  32.     while (ptrRecorrido){
  33.         ptrUltimo = ptrRecorrido;
  34.         ptrRecorrido = ptrRecorrido->sig;
  35.     }
  36.    
  37.     if (ptrUltimo)
  38.         ptrUltimo->sig = ptrNuevo;
  39.     else
  40.         (*ptrListaSE) = ptrNuevo;
  41. }
  42. void ponerEnCola(TNodo*nodo, TCola**Cola){ //lo pone al ultimo, no pone nulos
  43.     if(nodo){
  44.         TCola*nuevo=(TCola*)malloc(sizeof(TCola));
  45.         nuevo->valor=nodo;
  46.         nuevo->sig=NULL;
  47.         TCola*recor=*Cola;
  48.         TCola*ant=NULL;
  49.         while(recor){
  50.             ant=recor;
  51.             recor=recor->sig;
  52.         }
  53.         if(ant==NULL){
  54.             *Cola=nuevo;
  55.         }else{
  56.             ant->sig=nuevo;
  57.         }
  58.     }
  59. }
  60.  
  61. TNodo* sacarDeCola(TCola**Cola){ //saca el del primero
  62.     if(*Cola){
  63.         TNodo*nuevo;
  64.         TCola*sacar=*Cola;
  65.         nuevo=sacar->valor;
  66.         *Cola=(*Cola)->sig;
  67.         free(sacar);
  68.         return nuevo;
  69.     }
  70. }
  71. void crear_arbol(TNodo ** ptrRaiz){
  72.     *ptrRaiz = NULL;
  73. }
  74.  
  75. void inserta_nodo(TNodo **ptrRaiz, int valor){
  76.     TNodo *ptrHoja, *ptrRecorrido, *ptrPadre;
  77.     ptrHoja = (TNodo*)malloc(sizeof(TNodo));
  78.     ptrHoja->valor = valor;
  79.     ptrHoja->ptrHI=ptrHoja->ptrHD=NULL;
  80.    
  81.     if(*ptrRaiz){
  82.         ptrRecorrido = *ptrRaiz;
  83.         ptrPadre = NULL;
  84.        
  85.         while (ptrRecorrido){
  86.             ptrPadre = ptrRecorrido;
  87.             if (ptrRecorrido->valor > valor)
  88.                 ptrRecorrido = ptrRecorrido->ptrHI;
  89.             else
  90.                 ptrRecorrido = ptrRecorrido->ptrHD;                  
  91.         }
  92.         if (ptrPadre->valor > valor)
  93.             ptrPadre->ptrHI = ptrHoja;
  94.         else
  95.             ptrPadre->ptrHD = ptrHoja;
  96.     }
  97.     else{
  98.      *ptrRaiz = ptrHoja;  
  99.     }          
  100. }
  101.  
  102.  
  103. /* Calcula la altura del arbol.*/
  104. int height(TNodo* node)
  105. {
  106.    if (node==NULL)
  107.      return 0;
  108.    else
  109.    {
  110.      /* calcula la altura de cada sub-arbol */
  111.      int lHeight = height(node->ptrHI);
  112.      int rHeight = height(node->ptrHD);
  113.      /* retorna el maximo de ambas alturas */
  114.    
  115.      return (lHeight > rHeight)? (lHeight+1): (rHeight+1);
  116.    }
  117. }
  118.  
  119. /* Calcula la anchura de cada nivel */
  120. int getWidth(TNodo* root, int level)
  121. {
  122.      
  123.   if(root == NULL)
  124.     return 0;
  125.    
  126.   if(level == 1)
  127.     return 1;
  128.              
  129.   else if (level > 1)
  130.     return getWidth(root->ptrHI, level-1) +
  131.              getWidth(root->ptrHD, level-1);
  132. }
  133.  
  134. /* Funcion que retorna el nivel de maxiam anchura del arbol*/
  135. int getMaxWidth(TNodo* root)
  136. {
  137.   int maxWidth = 0;  
  138.   int width;
  139.   int h = height(root);
  140.   int i,level;
  141.    
  142.   /* Saco la anchura de cada nivel y comparo */
  143.   for(i=1; i<=h; i++)
  144.   {
  145.     width = getWidth(root, i);
  146.     if(width > maxWidth) {
  147.         maxWidth = width;
  148.          level=i;
  149.     }
  150.      
  151.   }    
  152.    
  153.   return level;
  154. }
  155.  
  156.  
  157. void recorridoAmplitud(TNodo*arbol2){
  158.     if(arbol2){
  159.         TCola* Cola=NULL; //cola creada
  160.         TNodo* nodo=arbol2;
  161.         ponerEnCola(nodo, &Cola);
  162.         while(Cola){
  163.             nodo=sacarDeCola(&Cola);
  164.             printf("%d-",nodo->valor);
  165.             ponerEnCola(nodo->ptrHD, &Cola);
  166.             ponerEnCola(nodo->ptrHI, &Cola);
  167.         }
  168.     }
  169. }
  170. int main(int argc, char** argv) {
  171. TNodo *ptrRaiz;
  172.     crear_arbol(&ptrRaiz);
  173.     inserta_nodo(&ptrRaiz, 4);
  174.     inserta_nodo(&ptrRaiz, 2);
  175.     inserta_nodo(&ptrRaiz, 1);
  176.     inserta_nodo(&ptrRaiz, 6);
  177.     inserta_nodo(&ptrRaiz, 5);
  178.     inserta_nodo(&ptrRaiz, 7);
  179.     inserta_nodo(&ptrRaiz, 10);
  180.     inserta_nodo(&ptrRaiz, 3);
  181.     int i=getMaxWidth(ptrRaiz);
  182.     recorridoAmplitud(ptrRaiz);
  183.  return (EXIT_SUCCESS);
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement