AVL树的左右单旋

AVL树又称高度平衡的二叉搜索树,它有如下几个性质:

1.左子树与右子树的高度差绝对值不超过1;

2.树中每个节点的左右子树都是AVL树;

3.每个节点都有一个平衡因子(balance factor)这里简称bf,AVL树中每个节点的平衡因子都为1,0,-1(每个节点的平衡因子等于该节点右子树的高度减去其左子树的高度)。

假设一棵AVL树有N个节点,其高度保持在log2N,插入删除查找算法的时间复杂度也是log2N(这里的log2N是指log以2为底的N的对数)。

了解完上面这些我们来探讨一下AVL树的左右单旋与双旋。

《AVL树的左右单旋》

首先我在这里给出一个粗略画出的AVL树,并在每个节点的右端标出它的平衡因子,就目前看来,这棵树是满足AVL树的所有性质的。

《AVL树的左右单旋》









《AVL树的左右单旋》

但是当我们在e节点的右子树新增一个节点之后,a,c,e这三个节点的平衡因子都发生了改变。

《AVL树的左右单旋》














此时a的平衡因子已经不满足AVL树的性质,所以我们要对其进行一些操作来让这棵树重新满足AVL树的性质,即旋转。

左单旋:

《AVL树的左右单旋》












《AVL树的左右单旋》

图中a,b,c为可能存在的子树,这三个子树高度均为h,左图中节点10的bf为1,20的bf为0,满足AVL树的性质,当我们在20的右子树c插入一个节点时,20的bf就变为了1,而10的bf则变为了2,此时我们要将10的bf降下来才能满足AVL树的性质,所以我们进行一个左旋,简单的说就是将10节点压下去,将20节点提上来,此时20成为这整个树的parent,10成为20的左节点,此时10的右节点的就变成了空,而要将10变成20的左节点,就要讲20的左子树b拿开,而20的左子树b又正好满足搜索树的条件可以成为10节点的右子树,所以将子树b链给10的右,整棵子树以10为轴进行了一次左旋,旋转完成之后20的bf为0,10的bf为0,满足AVL树的性质。

旋转之后的图如下:

《AVL树的左右单旋》

《AVL树的左右单旋》













右单旋:

《AVL树的左右单旋》











《AVL树的左右单旋》

右单旋的基本操作与左单旋类似,在这里我就不进行详细描述了。大致操作为,在20的左子树插入一个节点,然后进行右单旋,将30压下来成为20的右节点,将20提上去作为整棵树的parent,并将20的右子树给30的左,成为30的左子树。

熟悉AVL树的左右单旋之后,我将在下一篇博客中详细叙述AVL树的双旋与旋转中易出现并可能被忽视的问题。






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