数据结构与算法——AVL树简介

计算机科学中的树

二叉树
 二叉树  二叉查找树  笛卡尔树  Top tree
 T树      
 
自平衡二叉查找树
 AA树  AVL树  红黑树  伸展树
 树堆  节点大小平衡树    
 
B树
 B树  B+树  B*树  Bx树
 UB树  2-3树  2-3-4树  (a,b)-树
 Dancing tree  H树    
 
Trie
 前缀树  后缀树  基数树  
 
空间划分树
 四叉树  八叉树  k-d树  vp-树
 R树  R*树  R+树  X树
 M树  线段树  希尔伯特R树  优先R树
 
非二叉树
 Exponential tree  Fusion tree  区间树  PQ tree
 Range tree  SPQR tree  Van Emde Boas tree  
 
其他类型
   散列树  Finger tree  Metric tree
 Cover tree  BK-tree  Doubly-chained tree  iDistance
 Link-cut tree  树状数组  

二叉树:

任何节点最多只允许有两个子节点。

二叉搜索树:

可以提供对数时间的元素插入和访问。任何节点的键值一定大于其左子树中的每一个节点的键值,并不小于其右子树中的每一个节点的键值。

平衡二叉搜索树:

平衡的意思是,没有任何一个节点过深(深度过大)。二叉搜索树可能会在多次插入或删除之后,变得不平衡。


AVL-tree、RB-tree和AA-tree均可实现出平衡二叉搜索树。

AVL-tree是一个”加上了额外平衡条件”的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。要求任何节点的左右子树高度相差最多1。

根节点到任一节点的路径长度,即所谓该节点的深度。根节点的深度永远为0.

平衡树和不平衡树的区别:《数据结构与算法——AVL树简介》

插入节点11之后,树变得不平衡了:

《数据结构与算法——AVL树简介》

插入节点破坏了平衡条件的四种情况:

《数据结构与算法——AVL树简介》

情况1,4对称,称为外侧插入,可以采用单旋转操作调整解决。

情况2,3对称,称为内侧插入,可以采用双旋转操作调整解决。

《数据结构与算法——AVL树简介》

单旋转(旋转的情况为外侧插入):

《数据结构与算法——AVL树简介》

双旋转(旋转的情况为内侧插入):

《数据结构与算法——AVL树简介》



对于双旋转的情况,有一个特殊之处,比如上图,因为插入了15,引起了18的不平衡。15肯定是介于18和18的左子树之间的值。此时肯定要双旋转。
如果15的父节点不是18的子节点(上面的情况)双旋转其实就是将15的父节点代替18结点。(当然还是要旋转的,这只是一个特点)
如果15的父节点16是7的子节点(下面的情况)双旋转其实就是将15节点代替7结点。(当然还是要旋转的,这只是一个特点)


《数据结构与算法——AVL树简介》

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