首先AVLTree也是搜索二叉树,
他的出现主要是针对搜索二叉树的缺点出现的,比喻当一段有序的数据插入搜索二叉树中时,其树形成了一边型,这样降低了其查找的效率,所以有了AVLTree树,引入平衡因子,当bf大于2时,就会发生旋转。AVLTree是绝对平衡搜索二叉树
AVLTree插入数据的步骤:
1、按照正常的搜索二叉树进行插入,当大于根,往右插,小于根,往左插。
2、更新平衡因子:
如果是在parent的左边插入,则parent->bf--,如果在右边插入,则parent->bf++;
如果平衡bf等于0,则说明插入成功,并且树是平衡的,因为bf为0,说明在parent的低部位进行了插入,树的高度没有改变;
如果bf等于1或-1,说明树的高度进行了改变,那么需要向上判断其是否为平衡树。
如果bf为2或-2,则说明在该节点的子树已经不平衡,那么需要旋转,旋转之后,树就平衡,也就是可以跳出循环。
如果parent->bf==2,cur->bf=1,则进行左旋转,因为插入路线是直线且右边高,左旋转主要是将cur的左边变为parent的右边,parent变为cur的左边,另外需要注意个节点的指向,因为旋转后,其父亲节点就发生了变化,需要注意,并且旋转之后,parent和cur的bf都变为0,因为平衡了。
如果parent->bf==2,cur->bf=-1,则进行右左旋转,因为插入路径是折线,这样就得先将cur进行右旋转,再将parent进行左旋转。该种旋转需要注意parent和cur旋转后的bf,
如果parent->bf==-2,cur->bf==-1则进行右旋转,因为插入路线是直线且左边高,右旋转主要将cur的右边变为parent的左边,parent变为cur的右边。
如果parent->bf==-2,cur->bf==1;则进行左右旋转,先左再右。
删除:
和插入其实一样:
1、按照正常的搜索二叉树进行删除;左节点为空删、右节点为空删、左右节点都不为空。
2、更新平衡因子:
如果在parent左边删,则parent->++(相当于右边加一个)
如果在parent右边删,则parent->bf--。
如果删除后:bf变为1或-1,则插入成功,跳出循环,因为变为1,说明其原本为0,删除了一边,其高度没有改变,所以没事。
如果变为0,则需要向上调整,因为其高度发生了变化。
总结,插入删除主要就是观察其高度是否发生变化,如果高度不发生变化,则直接跳出循环,如果发生变化,则需要根据其bf的值来决定是旋转还是向上调整,旋转根据其插入数据的路径来决定是单旋转,还是双旋转。