我已经用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和一切已完成,但为了问题目的,我只是复制了这个。如果其他人需要其他东西来检查它,就这么说吧。
答案 0 :(得分:0)
好的,我需要做的就是保存父指针并重新分配孩子,以防有人感兴趣。