2014-04-08 2 views
0

저는 AVL 트리의 대부분을 파스칼로 프로그래밍 했으므로 노드를 회전하려고하면 의도 한대로 작동하지 않습니다.AVL 트리 회전 오류

이 순서대로 50 20 10을 삽입한다고 가정하면 프로 시저에 노드 50이 주어지고 순환을 수행 한 후 노드 20에 자식 노드가 다시 제공되어야하지만 대신 50을 반환합니다. 임은 매개 변수로 노드를 사용하고 그 자식 또는 무언가를 변경할 수 없으므로 확실하지 않습니다.

임 꽤 혼란스러워서 어떤 도움도 정말 환영받을 것입니다. 나는 노드 벨로우즈를 회전시키기 위해 사용하는 코드를 제공하고 노드가 값과 자식 값으로 노드를 검사하면 순환 프로 시저 내에서 노드 20은 그의 자식으로 10과 50을 가지므로 회전 자체가 문제가된다. 절차가 부모 노드로 20을 가진 노드를 돌려주지 않는다는 것 같습니다.

 50      20 
    20   to  10 50  but instead returns only 50 
10 

노드에게

procedure balancear(var a:arbol); // balancea el arbol dado 
var aux,aux2:arbol; 

    procedure rotationL; 
    begin 
    aux:=a^.left^.right; 
    aux2:=a^.left; 
    a^.left^.right:=a; 
    a^.left:=aux; 
    a:=aux2; 
    end 


begin 
    if a<>nil then 
    begin 
     if nivel(a^.left)-nivel(a^.right) > 1 then rotationL 
     else if nivel(a^.left)-nivel(a^.right) < -1 then rotationR; 
    end; 
end; 

니벨를 회전하는 데 사용되는 루틴 트리 노드가 균형을하지 않으면 내가 확인하는 데 사용하는 트리의 수준의 깊이를 반환하는 함수이다.

시간 내 주셔서 감사합니다.

P. 메신저 rotateL atm을 사용하여, 나는 rotateR 및 모든 일을하지만 askign 목적을 위해 난 그냥 이걸 복사했습니다. 다른 사람이 체크 아웃 할 다른 것을 필요로한다면 그렇게 말하십시오.

답변

0

좋아, 내가해야 할 일은 부모 포인터를 저장하고 관심있는 사람을 위해 자식을 재 할당하는 것뿐입니다.