写在前面:对于AVL的印象一直停留在左旋、右旋的层次,具体的概念都已经忘记了。趁着复习二叉树的劲儿,又认真学习了一下AVL。这两天也看了不少关于AVL的资料和博客,这里感谢https://www.cnblogs.com/zhuwbox/p/3636783.html,博主写的很通俗易懂。感恩师兄,南无本师释迦牟尼佛(今天看了灵光寺舍利)。
基本概念:
AVL树的本质是BST,但它又有下面的特点:
>它是一棵空树,或者它的左右子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
>平衡因子bf:结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1
对于一般的BST所言,它的期望高度是O(log2n),各个操作的时间复杂度为O(log2n),显然此时它便是一棵AVL树。但是我们必须要考虑到在极差的情况下,BST将变化为斜二叉树(比如插入的结点是有序的),此时的各操作的时间复杂度为O(n)。当然,插入的问题可以使用随机建立二叉树的方式来解决,但是在经过多次操作之后,由于在删除时,我们总是选择将待删除的结点的后继来取代它,这样就会造成右边的节点数减少,导致树的左边偏沉。这样也会提高时间复杂度。
AVL的插入操作,可能会造成树的不平衡,需要重新调整树。
需要考虑四种情况:
>右右插入,左旋(所有图片均选自https://www.cnblogs.com/zhuwbox/p/3636783.html,感谢大佬!)
>左左插入,右旋
和上面左旋刚好反过来。
>左右插入,左右旋
>右左插入,右左旋