【数据结构与算法】 通俗易懂讲解 AVL树

AVL树是一种特殊的二叉搜索树,所以若是你对二叉搜索树不熟悉,建议看完下面几篇二叉搜索树的文章再来学习AVL树,这样更容易理解。算法

通俗易懂讲解 二叉搜索树
通俗易懂讲解 二叉树遍历
通俗易懂讲解 二叉搜索树查找
通俗易懂讲解 二叉搜索树插入删除服务器

二叉搜索树的局限

咱们已经知道,通常状况二叉搜索树的查找效率为log(n),已经足够好了。可是这里为何强调是通常状况呢?是由于,对于一样的节点,插入的顺序不一样,最后获得的二叉搜索树的结构也不同,对于(2,3,4,5,6,7,8)序列,能够构成下面这样的一颗二叉搜索树:
【数据结构与算法】 通俗易懂讲解 AVL树
仍是(2,3,4,5,6,7,8)序列,它也能构成下面这样的二叉搜索树,准确的说它应该是一个单链表了,对于单链表,咱们很清楚,它的查找操做时间复杂度为n。
【数据结构与算法】 通俗易懂讲解 AVL树
n和log(n)的时间复杂度意味什么?从下面的图能够看到,随着元素的增长,log(n)的时间复杂度的增加要远小于n。所以咱们天然但愿二叉搜索树能尽量保持log(n)的深度。所以,本文的主人公AVL树横空出世了。
【数据结构与算法】 通俗易懂讲解 AVL树数据结构

什么是AVL树

AVL树,是一种平衡(balanced)的二叉搜索树。由两位科学家在1962年发表的论文《An algorithm for the organization of information》当中提出,做者是发明者G.M. Adelson-Velsky和E.M. Landis。ide

相比于"二叉查找树",AVL树的特色是:AVL树中任何节点的两个子树的高度最大差异为1。 关于树的高度等基本概念,请参考前面文章通俗易懂讲解 二叉搜索树(请戳我)
【数据结构与算法】 通俗易懂讲解 AVL树
上面图中,左边的是AVL树,它的任何节点的两个子树的高度差异都<=1;而右边的不是AVL树,由于7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。学习

关于AVL树的操做,大部分都能复用平衡二叉树树的操做,可是对于插入和删除操做来讲,极可能因为节点的插入和删除致使AVL树的平衡状态就被破坏,因此咱们须要一种机制来检测这棵树是否平衡,以及当它不平衡的时候,咱们应该经过某些操做使它从新平衡(rebalanced)。orm

旋转

前面讲到若是在AVL树中进行插入一个新的节点或删除某个节点后,可能致使AVL树失去平衡。这种失去平衡的能够归纳为4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左)。下面给出它们的示意图:
【数据结构与算法】 通俗易懂讲解 AVL树
上图中的4棵树都是"失去平衡的AVL树",从左往右的状况依次是:LL、LR、RL、RR。除了上面的状况以外,还有其它的失去平衡的AVL树,以下图:
【数据结构与算法】 通俗易懂讲解 AVL树
上面的两张图都是为了便于理解,而列举的关于"失去平衡的AVL树"的例子。总的来讲,AVL树失去平衡时的状况必定是LL、LR、RL、RR这4种之一,它们都由各自的定义:视频

LL:称为"左左"。插入或删除一个节点后,根节点的左子树的左子树还有非空子节点,致使"根的左子树的高度"比"根的右子树的高度"大2,致使AVL树失去了平衡。blog

示例:上面LL状况中,因为"根节点(8)的左子树(4)的左子树(2)还有非空子节点",而"根节点(8)的右子树(12)没有子节点";致使"根节点(8)的左子树(4)高度"比"根节点(8)的右子树(12)"高2。it

LR:称为"左右"。插入或删除一个节点后,根节点的左子树的右子树还有非空子节点,致使"根的左子树的高度"比"根的右子树的高度"大2,致使AVL树失去了平衡。io

示例:上面LR状况中,因为"根节点(8)的左子树(4)的左子树(6)还有非空子节点",而"根节点(8)的右子树(12)没有子节点";致使"根节点(8)的左子树(4)高度"比"根节点(8)的右子树(12)"高2。

RL:称为"右左"。插入或删除一个节点后,根节点的右子树的左子树还有非空子节点,致使"根的右子树的高度"比"根的左子树的高度"大2,致使AVL树失去了平衡。

示例:上面RL状况中,因为"根节点(8)的右子树(12)的左子树(10)还有非空子节点",而"根节点(8)的左子树(4)没有子节点";致使"根节点(8)的右子树(12)高度"比"根节点(8)的左子树(4)"高2。

RR:称为"右右"。插入或删除一个节点后,根节点的右子树的右子树还有非空子节点,致使"根的右子树的高度"比"根的左子树的高度"大2,致使AVL树失去了平衡。

示例:上面RR状况中,因为"根节点(8)的右子树(12)的右子树(14)还有非空子节点",而"根节点(8)的左子树(4)没有子节点";致使"根节点(8)的右子树(12)高度"比"根节点(8)的左子树(4)"高2。

前面讲过在AVL树不平衡的时候,咱们应该经过某些操做使它从新平衡,后面将会单独用一篇文章总结"LL(左左),LR(左右),RR(右右)和RL(右左)"这4种状况对应的旋转方法。

推荐阅读:

精心整理 | 历史干货文章目录
【福利】本身搜集的网上精品课程视频分享(上)
【数据结构与算法】 通俗易懂讲解 二叉树遍历
【数据结构与算法】 通俗易懂讲解 二叉搜索树

专一服务器后台技术栈知识总结分享

欢迎关注交流共同进步

【数据结构与算法】 通俗易懂讲解 AVL树

码农有道 coding

码农有道,为您提供通俗易懂的技术文章,让技术变的更简单!

相关文章
相关标签/搜索