Programación General > Pascal
Insertar(a:arbolbalanceadoporaltura; X:trotulo);
(1/1)
Ocean Soul:
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 --- Procedure AgregarHijo(VAR A:AVL; X:Trotulo; var cod:integer);VarBalance:Integer;Beginif A<>nil then Begin if IgualRotulo(x, A^.info) {x=A^.info} then cod:=1 else If MenorRotulo(x, A^.info) {x<A^.info} then AgregarHijo(A^.HI, X, cod) else AgregarHijo(A^.HD, x, cod); cod:=0; Balancear(A); end else Begin New(A); AsignarRotulo(x, A^.info); {A^.info:=X} A^.hi:=nil; A^.hd:=nil; end;end;{-----------------------------------------------------------------------------------}Function Altura(A:AVL):Integer; {Simplemente saca la altura de un arbol, los arboles nulos tiene altura -1}VarASI,ASD:integer;Begin If A=nil then ALtura:=-1 else Begin ASI:=Altura(A^.HI)+1; ASD:=Altura(A^.HD)+1; If ASI<=ASD then Altura:=ASD else ALtura:=ASI; end;end;{-----------------------------------------------------------------------------------}Procedure RotSimpleDerecha(var A:AVL);varq,temp:ptrAVL;Begin if A<>nil then Begin Q:=A^.HI; Temp:=Q^.hd; Q^.HD:=A; A^.HI:=temp; a:=Q; end;end;{-----------------------------------------------------------------------------------}Procedure RotSimpleIzquierda(VAR A:AVL);Varq,temp:ptrAVL;Begin If A<>nil then Begin Q:=A^.hd; temp:=Q^.HI; Q^.hI:=A; A^.hd:=temp; a:=q; end;end;{-----------------------------------------------------------------------------------}Procedure Balancear(var A:AVL);VarBalance{,stack}:Integer;Begin stack:=0; If A<>nil then Begin Balance:=Altura(A^.HI)-Altura(A^.HD); While (Balance=2) or (Balance=-2) {and (stack<=3)} do Begin If balance=2 then RotSimpleDerecha(A) else RotSimpleIzquierda(A); Balance:=Altura(A^.HI)-Altura(A^.HD); {inc(stack);} end; end;end;{-----------------------------------------------------------------------------------} Gracias, espero que me puedan ayudar... :unsure:
Alpha_:
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.
Navegación
Ir a la versión completa