AVL树常用算法算法

上一次我们讲了BST二叉搜索树的结构,添加一个约束条件。左子树要比右子树小,这样来约束二叉树的性质。但是BST同时也是有一个很大缺陷的,就是有可能出现下图的情况
《AVL树常用算法算法》
(图转自:http://www.cnblogs.com/vamei/archive/2013/03/21/2964092.html
这种情况就是BST彻底退化成一颗二叉树。查找节点的时间还是需要O(n)的时间,这显然是不可以接受的。所以我们还需要再加一个约束条件就是左子树和右子树相差不超过1.加上这个约束条件以后,二叉树就会十分接近于一颗完全二叉树了。这样显然就避免了退化的情况。
AVL的增加操作就会出现打破这种平衡的情况,这时候需要我们通过自旋来修复条件。如何进行自旋呢。分为四种情况,分别是LL,RR,LR,RL。
首先是LL:
《AVL树常用算法算法》
其实主要思路就是寻找这颗子树的root节点,根据BST的定义,不难看出应该是找中间节点2作为root。所以得出来根节点作为左子树,子节点作为右子树。
如何RR与LL类似,只不过一个左一个右罢了。
AVL的旋转关键是下面两个旋转LR和RL:
《AVL树常用算法算法》
LR和RL思路其实也是一样的,因为子节点就是2它处于中间位置,所以拿2作为root节点,然后进行旋转。
在旋转的过程中我们经常遇到一种情况:
《AVL树常用算法算法》
按照我们刚刚所说的原理进行旋转,那我们不是出现这种问题啦?这个是什么鬼问题呢。。。就是旋转的时候破坏了二叉树的特点,其实大家还记不记得BST的删除操作那里,删除一个具有left和right节点的一颗节点。我的算法是先拿它右子树的最小节点进行替换,然后在把最小的节点删除掉,其实这样做的原理就是BST里面左子树最右的节点和root和右子树最左节点的值是相邻的。其实和我们接下来的操作形势上没有什么相似,但是我这样说一下。扩展一下大家思路,大家想到怎么搞没,其实就是把4挂到5的左子树就可以了。如图
《AVL树常用算法算法》
上面就是我对AVL旋转的理解。下次有时间我会继续研究其代码实现的。

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