AVL Tree概念之旋转

在探寻AVL Tree旋转这一概念之前,需要弄清楚的一些概念:

    1、二叉搜索树(BinarySearch Tree):若树的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树(Reference to二叉搜索树)     

   2、An AVL treeis a self-balancing binary search tree.In an AVL tree, the heightsof the twochild subtrees of any node differ by at most one; if at any time they differ bymore than one, rebalancing is done to restore this property. (Reference to AVL tree)

   3、平衡因子:二叉树某节点左右子树高度差(左减右为正还是右减左为正可自定义,下面的例子假定左减右为正)

   4、最小不平衡子树:以距离插入节点最近的且平衡因子绝对值大于1的节点为根节点的子树(Reference to 大话数据结构)

 

了解这些以后可以进行下一步了,AVL Tree之"旋转":

旋转:

   1、旋转按方向可分为 左旋转(逆时针)右旋转(顺时针)

   2、按转转次数可分为 单旋转(左/右旋转)双旋转(先左后右/先右后左)

旋转的目的:

    在于使最小不平衡子树达到平衡。旋转都是围绕着这个目的展开的。

旋转类型(单/双):

1、  当最小不平衡子树的平衡因子与其子树(新加节点路径上的子树)的平衡因子为同符号性质(同为正/负号)时单旋转

AVL Tree概念之旋转_第1张图片

最小不平衡子树平衡因子-2,其子树平衡因子-1,同号单旋转

    2、当最小不平衡子树的平衡因子与其子树(新加节点路径上的子树)的平衡因子为异符号性质(正负/负正)时双旋转

AVL Tree概念之旋转_第2张图片

最小不平衡子树平衡因子-2,其子树平衡因子1(虽说节点节点5所在树也算其子树,但是不在新加节点的路径上,所以平衡因子为1不为0),异号双旋转

旋转轴:

旋转轴的确定与旋转类型(单/双旋转)相关

1、旋转轴是原最小不平衡子树修正过后的最小子树的根节点

AVL Tree概念之旋转_第3张图片

AVL Tree概念之旋转_第4张图片

AVL Tree概念之旋转_第5张图片

2、  当需要单旋转,轴为最小不平衡子树根的孩子节点

AVL Tree概念之旋转_第6张图片

值为9的节点

3、  当需要双旋转,轴为最小不平衡子树根的孙子节点

AVL Tree概念之旋转_第7张图片

值为7的节点

 

旋转方向:

1、  为单旋转时,当最小不平衡子树的左子树高则右旋转以降低左子树高度以达到平衡(旋转的目的)

AVL Tree概念之旋转_第8张图片

左子树高,右旋转降低左子树高

    2、为单旋转时,当最小不平衡子树的右子树高时左旋以降低右子树高度以达到平衡

     3、为双旋转时,当最小不平衡子树的平衡因子为正,但其子树的平衡因子为负时,先左旋转以使最小不平衡子树的平衡因子与其子树的平衡因子相同(目的在于转化成满足单旋转的情况,为下一次旋转做准备),左旋后最小不平衡子树的平衡因子与其子树的平衡因子相同,接下来右旋转以降低最小不平衡子树的左子树高度以达到平衡(旋转的目的)

AVL Tree概念之旋转_第9张图片

第一次旋转为第二次的平衡旋转做准备

    4、先右后左的双旋转的原理同上,就不在叙述了

下面解释为何双旋转的存在是必要的:

AVL树是二叉搜索树,必须满足二叉搜索树的性质,当必须双旋转时单旋转,你会发现旋转后的最小不平衡子树与二叉搜索树的性质相驳

AVL Tree概念之旋转_第10张图片

注:

1、  在旋转的过程中,为了满足二叉搜索树的性质,AVL树中最小不平衡子树内的节点的双亲节点可能发生改变,但任何改变都不会超出最小不平衡子树的范围,另外,改变是根据二叉搜索树的性质进行的

AVL Tree概念之旋转_第11张图片AVL Tree概念之旋转_第12张图片

旋转前,值为8的节点的双亲节点为值为7的节点,旋转后其双亲节点为值为9的节点

2、  另外,为了帮助理解旋转,在旋转时可以人为的当作最小不平衡子树之外的部分不存在,旋转完成之后再拼接回去


参考 大话数据结构

AVL树的旋转操作详解


你可能感兴趣的:(数据结构与算法)