上篇博客中,我已将AVL树的定义、性质及旋转的情况做了初步的介绍,现在我们着重看双旋的情况!
1.左右双旋
如图所示,我们可以看出方框a、b、c、d处都可以插入结点,故可分为以下几种情形:
1.将结点只插入方框a处,计算整棵树中结点的平衡因子可执行,该树就是一颗AVL树,无须旋转;
2.将结点只插入方框b中,则整棵树可以按照右单旋进行处理,构不成双旋;
3.将结点只插入方框c或者方框d中,则方框a、b中必须有一个结点。若方框b中无结点,则在结点20的平衡因子就是2,已经就需要调整了,无法上传到结点10;若方框a中无结点,则在结点10的平衡因子就是-2,已经就需要调整了,无法下传传到结点30,所以方框a、b中必须有结点,且为叶子结点。
此时,可将该树看作两部分,第一部分以结点20作为父亲结点及其以下的结点作为整体,进行整体的左单旋,单旋后的树为图中的第二棵树;第二部分以结点10作为父亲结点,将整棵树进行整体的右单旋,得到了图中的第三棵树,这棵树已经是AVL树了。
2.右左双旋
如图所示,我们可以看出方框a、b、c、d处都可以插入结点,故可分为以下几种情形:
1.将结点只插入方框a处,计算整棵树中结点的平衡因子可执行,该树就是一颗AVL树,无须旋转;
2.将结点只插入方框d中,则整棵树可以按照左单旋进行处理,构不成双旋;
3.将结点只插入方框c或者方框b中,则方框a、d中必须有一个结点。若方框d中无结点,则在结点20的平衡因子就是-2,已经就需要调整了,无法上传到结点10;若方框a中无结点,则在结点10的平衡因子就是-2,已经就需要调整了,无法下传传到结点30,所以方框a、d中必须有结点,且为叶子结点。
此时,可将该树看作两部分,第一部分以结点20作为父亲结点及其以下的结点作为整体,进行整体的右单旋,单旋后的树为图中的第二棵树;第二部分以结点10作为父亲结点,将整棵树进行整体的左单旋,得到了图中的第三棵树,这棵树已经是AVL树了。
若是不懂AVL树的定义、性质、左单旋及右单旋的童学,可以查看我的上一篇博客,链接为http://blog.youkuaiyun.com/manongdeyipiant/article/details/69175107