AVL树的LR和RL旋转

AVL树是指在一颗二叉树中,任一个结点的平衡因子都不超过1。一个节点的平衡因子是该节点的右子树的高度与左子树的高度的差。

为什么要有AVL树?

AVL树通常被用在二叉搜索树(BST)中,BST是满足这样条件的二叉树:树中任一节点的左子树根节点的值小于根节点的值,根节点的值小于右子树根节点的值。

在一颗二叉搜索树查找一个值的平均时间复杂度为log(n),但是若BST所有的节点向一边倾斜,这时候的查找就退化为线性查找,复杂度为n。为了获得更高的查找效率,就有了AVL树的概念,对于一颗非平衡的AVL树,可以通过旋转变换为AVL树。

BST是对基于数组存储元素的一种变治(改变表现),从而提高了查找的效率,BST还有很多变种,这些都是基于BST的变治。如下:

《AVL树的LR和RL旋转》

将一颗非平衡的树通过旋转转换为AVL树。只叙述LR旋转

LR旋转:

引起LR旋转的原因一般为在一个节点(如1号节点)的左子树(L)根节点的右子树(R)上插入了一个节点,使1号节点失去平衡,如左图中红色的6号节点。

《AVL树的LR和RL旋转》

L旋转的规则:

对失去平衡节点(1号)的左子树(根节点为2)进行L操作

这里1的左子树的根节点为2,L操作为2的右子树的根节点(4号)作为新的根节点,2连同它的左子树作为新的根节点(4号)的左子树,原来4号节点的左子树(这里为空)作为改变后2这个节点的右子树,原来4的左子树(6号)继续作为4的右子树。L旋转后如上右图。

如上L旋转完后,1号节点还是不平衡的,此时还要进行R旋转。

《AVL树的LR和RL旋转》

R旋转的规则:

对失去平衡的节点(1号节点)进行R操作

失去平衡节点(1号)的左子树的根节点(4号)作为新的根节点,原来的根节点(1号)连同它的右子树(5号)作为新的根节点(4号)的右子树,新的根节点(4号)原来的右子树(6号)作为现在右子树根节点(1号)的左子树,如上右图。

RL旋转和LR类似,一般是由一个节点右子树根节点的左子树添加一个节点引起的。

旋转的时候,是先对失去平衡节点的右子树进行R操作,然后对失去平衡的节点进行L操作。

对于单独的L旋转和R旋转,可以看出是上面过程中的一部分。

引起L旋转的原因是:在某个节点(如1)的右子树(R)根节点的右子树(R)中插入一个节点,使1号节点失去平衡,这时候需要L旋转。

引起R旋转的原因就相反了,在某个节点(如1)的左子树(L)根节点的左子树(L)中插入一个节点,使1号节点失去平衡,这时候需要R旋转。

    原文作者:AVL树
    原文地址: https://blog.csdn.net/CHEN_JP/article/details/8040013
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞