我有一系列应该放入AVL树的数字:
50,22,80,70,75,73
我不确定73会去哪儿。根据我的理解,当75成为70的正确孩子时,第一个平衡发生了:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
因此,80是“不平衡”节点,70是重左子节点。因此,向左移动70次,向右移动80次,不知何故,如下所示:
50
/ \
22 80
/
70
\
75
添加73,我们又变得不平衡了:
50
/ \
22 75
/ \
70 80
我如何平衡这个?我不能把73放在75到70之间,是吗?
答案 0 :(得分:1)
有一个明确定义的程序来重新平衡AVL树。
左侧重型箱有对称程序,我相信您可以自己弄明白。
上述程序的psudocode看起来像这样。
z=firstUnbalancedNode();
if(rightHeavy(z))
{
if(rightHeavy(z.rightChild))
{
rotateLeft(z.rightChild);
}
else
{
rotateRight(z.rightChild)
rotateLeft(z.rightChild)
}
}
在你的情况下
插入树后看起来像这样
50
/ \
22 75
/ \
70 80
\
73
现在我们在50岁的右侧孩子(75)上进行正确的轮换。在这个旋转树看起来像这样
之后 50
/ \
22 70
\
75
/ \
73 80
在此之后我们必须在50岁的右边孩子(70)上进行左旋。这会将树转换为以下结构。
70
/ \
50 75
/ / \
22 73 80
所以你可以看到有两个基本的旋转。左和右。 在某些情况下,单个旋转可以完成工作,而在其他情况下,您可能需要执行两个旋转。