STL之AVL树

关联式容器 之所以说是关联式容器,每笔数据都有一个键值和一个实值,当元素插入关联式容器时,容器会按照键值大小, 依据特定规则(set,multiset,map,multimap是红黑树,hash是hash表)将元素放在特定位置; 所以关联式容器就不会有push_back( )  pop_back( ) push_front( ) pop_front( )等操作;

首先了解一下树的深度和节点的高度,定义:根节点至另外一个节点所经过的边的条数,称为路径长度;从根节点到树的叶子结点所经过的最大路径长度即为树的深度; 从一个节点,向下到达它的叶子结点的最大路径长度称为是该节点的高度;

AVL树介绍 因为二叉搜索树在某种条件下是依然会造成性能的下降,而AVL树则是加上了额外平衡条件的二叉搜索树,起平衡条件是为了树的深度维持在O(logN),但是一般的平衡条件是每个节点的左右子树高度相同,这个太过严格了,所以,AVL树退而求其次,只要求任意一个节点的左右子树的高度差不超过1; 插入操作,AVL树的重点在于其插入操作,如果一个插入操作不会引起原有树结构的不平衡,则不用调整树结构;但是如果一个插入操作引起原有树结构的不平衡,则AVL树会针对“平衡被破坏的节点中最深的那个节点X处进行调整”,这又分为几种情况: 1):插入位置在X的左子节点的左子树上; 2):插入位置在X的左子节点的右子树上; 3):插入位置在X的右子节点的左子树上; 4):插入位置在X的右子节点的右子树上;

总的来时,1)和4)可以归为一类情况(左左,右右) 这种情况称为是:外侧插入,可以通过一次单旋转搞定,具体过程是: ①:通过将X的左子节点X_left  提起使得 X 节点自动下沉,然后重新调整节点 ②:使得X处于X_left 的右子节点位置 ③:使X_left 的原来的右子树称为X的左子树;

2)和3)可以归为一类情况(左右,右左),这种情况称为 内侧插入,必须通过两次单旋转搞定,也即双旋转,具体过程是:

①:对于不平衡节点X的左子树(如果是情况3的话则道理相反)先进行一次单旋转; ②:然后再对X进行一次单旋转;

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