• Domingo 22 de Diciembre de 2024, 06:49

Autor Tema:  Insertar(a:arbolbalanceadoporaltura; X:trotulo);  (Leído 1134 veces)

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Insertar(a:arbolbalanceadoporaltura; X:trotulo);
« en: Miércoles 26 de Octubre de 2005, 22:07 »
0
Buenas, alguien me prodria corregir el siguiente codigo:

Es sobre Arboles balanceados por altura (AVL); El problema es cuando por ejemplo se ingresa el siguiente arbol:
50 13 40 el error bucle infinito se produce en el procedimiento Balancear(A:AVL). AYUDA!!!!


Código: Text
  1.  
  2. Procedure AgregarHijo(VAR A:AVL; X:Trotulo; var cod:integer);
  3. Var
  4. Balance:Integer;
  5. Begin
  6. if A<>nil then
  7.   Begin
  8.     if IgualRotulo(x, A^.info) {x=A^.info} then cod:=1 else
  9.     If MenorRotulo(x, A^.info) {x<A^.info} then AgregarHijo(A^.HI, X, cod) else
  10.                         AgregarHijo(A^.HD, x, cod);
  11.                 cod:=0;
  12.     Balancear(A);
  13.   end else
  14.   Begin
  15.     New(A); AsignarRotulo(x, A^.info); {A^.info:=X}
  16.     A^.hi:=nil; A^.hd:=nil;
  17.   end;
  18. end;
  19. {-----------------------------------------------------------------------------------}
  20. Function Altura(A:AVL):Integer; {Simplemente saca la altura de un arbol, los arboles nulos tiene altura -1}
  21. Var
  22. ASI,ASD:integer;
  23. Begin
  24.   If A=nil then ALtura:=-1 else
  25.   Begin
  26.     ASI:=Altura(A^.HI)+1;
  27.     ASD:=Altura(A^.HD)+1;
  28.     If ASI<=ASD then Altura:=ASD else ALtura:=ASI;
  29.   end;
  30. end;
  31. {-----------------------------------------------------------------------------------}
  32. Procedure RotSimpleDerecha(var A:AVL);
  33. var
  34. q,temp:ptrAVL;
  35. Begin
  36.   if A<>nil then
  37.   Begin
  38.     Q:=A^.HI;
  39.     Temp:=Q^.hd;
  40.     Q^.HD:=A;
  41.     A^.HI:=temp;
  42.                 a:=Q;
  43.   end;
  44. end;
  45. {-----------------------------------------------------------------------------------}
  46. Procedure RotSimpleIzquierda(VAR A:AVL);
  47. Var
  48. q,temp:ptrAVL;
  49. Begin
  50.   If A<>nil then
  51.   Begin
  52.     Q:=A^.hd;
  53.     temp:=Q^.HI;
  54.     Q^.hI:=A;
  55.     A^.hd:=temp;
  56.                 a:=q;
  57.   end;
  58. end;
  59. {-----------------------------------------------------------------------------------}
  60. Procedure Balancear(var A:AVL);
  61. Var
  62. Balance{,stack}:Integer;
  63. Begin
  64.         stack:=0;
  65.   If A<>nil then
  66.   Begin
  67.     Balance:=Altura(A^.HI)-Altura(A^.HD);
  68.     While (Balance=2) or (Balance=-2) {and (stack<=3)} do
  69.     Begin
  70.       If balance=2 then RotSimpleDerecha(A) else
  71.                                                               RotSimpleIzquierda(A);
  72.       Balance:=Altura(A^.HI)-Altura(A^.HD); {inc(stack);}
  73.     end;
  74.   end;
  75. end;
  76. {-----------------------------------------------------------------------------------}
  77.  
  78.  
Gracias, espero que me puedan ayudar...  :unsure:

Alpha_

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: Insertar(a:arbolbalanceadoporaltura; X:trotulo);
« Respuesta #1 en: Viernes 28 de Octubre de 2005, 17:37 »
0
A full con los árboles, eh? ;)

No te faltan dos tipos de balanceo todavía?

Pienso que quizás por eso que se queda iterando, pero no he hecho una prueba de escritorio para constatarlo.
Alpha
http]