AVL树旋转错误

时间:2014-04-08 14:35:54

标签: tree rotation pascal

我已经用pascal编写了大部分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;

nivel是一个返回树的级别深度的函数,我用它来检查树节点是否不平衡。

感谢您的时间。

P.S。我只使用rotationL atm,我有旋转R和一切已完成,但为了问题目的,我只是复制了这个。如果其他人需要其他东西来检查它,就这么说吧。

1 个答案:

答案 0 :(得分:0)

好的,我需要做的就是保存父指针并重新分配孩子,以防有人感兴趣。