elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No entiendo nada ! de arboles "AVL"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No entiendo nada ! de arboles "AVL"  (Leído 2,256 veces)
ivanel93

Desconectado Desconectado

Mensajes: 10


Ver Perfil
No entiendo nada ! de arboles "AVL"
« en: 11 Mayo 2013, 20:39 pm »

Hey hola ya he recibido ayuda de ustedes y de nuevo vengo para eso , resulta que no entiendo un nada un código que mi profe me ha proporcionado, es acerca de los arboles(arboles AVL) y sus rotaciones por medio de listas, pero no le entiendo al código amigos ya me han dicho que es algo arcaico y tiene su complejidad, lo que quisiera saber es como funciona el código y en especial la fucnion de "Rotar a la izquierda" y la de "Insert" y el "main" (como esta estructurado) espero contar con su ayuda, dejo el código es "C"

Código
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. typedef struct node
  7. {
  8.   int num, bal;
  9.   struct node *izq, *der;
  10. }node;
  11.  
  12. typedef node *ptr;
  13.  
  14. void rota_izq(ptr *pp)
  15. {
  16.   ptr p=*pp, r;
  17.   *pp=r=p->der;
  18.   p->der=r->izq;
  19.   r->izq=p;
  20.   p->bal--;
  21.   if(r->bal > 0)
  22.      p->bal -= r->bal;
  23.   r->bal--;
  24.   if(p->bal < 0)
  25.      r->bal += p->bal;
  26. }
  27.  
  28. void rota_der(ptr * pp)
  29. {
  30.   ptr p=*pp, l;
  31.   *pp = l = p->izq;
  32.   p->izq = l->der;
  33.   l->der = p;
  34.   p->bal++;
  35.   if(l->bal < 0)
  36.      p->bal -= l->bal;
  37.   l->bal++;
  38.   if(p->bal > 0)
  39.      l->bal += p->bal;
  40. }
  41.  
  42. int insert(ptr *pp, int x)
  43. {
  44.   int deltaH=0;
  45.   ptr p=*pp;
  46.   if(p == NULL)
  47.   {
  48.      *pp = p = (ptr)malloc(sizeof(node));
  49.      if(p==NULL)
  50. puts("Not enough memory"), exit(1);
  51.      p->num = x;
  52.      p->bal=0;
  53.      p->izq = p->der = NULL;
  54.      deltaH = 1;
  55.   }
  56.   else
  57.      if(x > p->num)
  58.      {
  59. if(insert(&p->der, x))
  60. {
  61.    p->bal++;
  62.    if(p->bal == 1)
  63.       deltaH=1;
  64.    else
  65.       if(p->bal ==2)
  66.       {
  67.  if(p->der->bal == -1)
  68.     rota_der(&p->der);
  69.  rota_izq(pp);
  70.       }
  71. }
  72.      }
  73.      else
  74. if(x < p->num)
  75. {
  76.    if(insert(&p->izq, x))
  77.    {
  78.       p->bal--;
  79.       if(p->bal == -1)
  80.  deltaH= 1;
  81.       else
  82.  if(p->bal == -2)
  83.  {
  84.     if(p->izq->bal == 1)
  85. rota_izq(&p->izq);
  86.     rota_der(pp);
  87.  }
  88.    }
  89. }
  90. return deltaH;
  91. }
  92.  
  93. int delnode(ptr *pp, int x)
  94. {
  95.   ptr p=*pp, *qq;
  96.   int deltaH = 0;
  97.   if(p==NULL)
  98.      return 0;
  99.   if(x < p->num)
  100.   {
  101.      if(delnode(&p->izq, x))
  102.      {
  103. p->bal++;
  104. if(p->bal == 0)
  105.    deltaH=1;
  106. else
  107.    if(p->bal==2)
  108.    {
  109.       if(p->der->bal == -1)
  110.  rota_der(&p->der);
  111.       rota_izq(pp);
  112.       if(p->bal == 0)
  113.  deltaH=1;
  114.    }
  115.      }
  116.   }
  117.   else
  118.      if(x>p->num)
  119.      {
  120. if(delnode(&p->der, x))
  121. {
  122.    p->bal--;
  123.    if(p->bal ==0)
  124.       deltaH=1;
  125.    else
  126.       if(p->bal == -2)
  127.       {
  128.  if(p->izq->bal ==1)
  129.     rota_izq(&p->izq);
  130.  rota_der(pp);
  131.  if(p->bal == 0)
  132.     deltaH = 1;
  133.       }
  134. }
  135.      }
  136.      else
  137.      {
  138. if(p->der == NULL)
  139. {
  140.    *pp = p->izq;
  141.    free(p);
  142.    return 1;
  143. }
  144. else
  145.    if(p->izq == NULL)
  146.    {
  147.       *pp = p->der;
  148.       free(p);
  149.       return 1;
  150.    }
  151.    else
  152.    {
  153.       qq = &p->izq;
  154.       while((*qq)->der != NULL)
  155.  qq = &(*qq)->der;
  156.       p->num=(*qq)->num;
  157.       (*qq)->num=x;
  158.       if(delnode(&p->izq, x))
  159.       {
  160.  p->bal++;
  161.  if(p->bal == 0)
  162.     deltaH = 1;
  163.  else
  164.     if(p->bal ==2)
  165.     {
  166. if(p->der->bal == -1)
  167.   rota_der(&p->der);
  168. rota_izq(pp);
  169. deltaH=1;
  170.     }
  171.       }
  172. }
  173.   }
  174.   return deltaH;
  175. }
  176.  
  177. void printtree(node *p, int pos)
  178. {
  179.   if(p != NULL)
  180.   {
  181.      printtree(p->der, pos+6);
  182.      printf("%*d %d\n", pos, p->num, p->bal);
  183.      printtree(p->izq, pos+6);
  184.   }
  185. }
  186.  
  187. main()
  188. {
  189.   int x;
  190.   char ch;
  191.   node *root = NULL;
  192.  
  193.   clrscr();
  194.   puts("\nCada arbol AVL presentado en el problema tiene\n"
  195. "su raiz en la izq. Girela 90 grados\n"
  196. "en el sentido del reloj para obtener su representacion usual\n");
  197.   for(;;)
  198.   {
  199.      printf("Digite un entero, seguido de I para insertar\n"
  200.     "o por D para borrar, o Q para salir: ");
  201.      if(scanf("%d %c",&x, &ch) != 2)
  202. break;
  203.      ch = toupper(ch);
  204.      if(ch == 'I')
  205. insert(&root, x);
  206.      else
  207. if(ch == 'D')
  208.    delnode(&root, x);
  209.      printtree(root, 6);
  210.   }
  211.   return 0;
  212. }
  213.  
  214.  


« Última modificación: 11 Mayo 2013, 21:11 pm por ivanel93 » En línea

ivanel93

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: No entiendo nada ! de arboles "AVL"
« Respuesta #1 en: 20 Mayo 2013, 02:34 am »

Pueden borrar el tema? ya lo solucione.


En línea

Aprendiz-Oscuro
Colaborador
***
Desconectado Desconectado

Mensajes: 6.776



Ver Perfil
Re: No entiendo nada ! de arboles "AVL"
« Respuesta #2 en: 20 Mayo 2013, 02:44 am »

Si lo has solucionado deberias postear dicha solución, le podria valer a otros usuarios con un problema similar... de eso trata el foro.


Saludos
En línea

Leer las reglas del Foro

Hago montajes y/o configuraciones detalladas de ordenadores a medida. Para más información mandar mensaje privado.
ivanel93

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: No entiendo nada ! de arboles "AVL"
« Respuesta #3 en: 26 Mayo 2013, 17:57 pm »

Ok pero es uno de mis apuntes
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines