AVL树的插入算法

AVL树是一颗空树或者是左右子树都是AVL树,且左右子树的高度之差绝对值不超过1,我们记为bf。
我们可以有如下的结构定义:
template
class AVLNode
{
private:
Type data;
AVLNode* leftChild;
AVLNode* rightChild;
int bf;
};

template
class AVLTree
{
public:
AVLTree():root(NULL){}
private:
AVLNode* root;
};

我的想法是这样的:
由于我们要满足AVL的左右子树高度差不大于1的性质,所以我们需要在寻找合适插入过程中记录一个stack,把所有走过的路径记录下来,因此我定义两个结点指针pr,t。保证pr永远是t的父结点。申请空间,插入结点。在插入完成后,我们不能保证树是平衡的,还有平衡因子的正确性。所以,我们需要进行调整。具体调整原因在代码图例中分析。
《AVL树的插入算法》
下面具体实现四种旋转方法
《AVL树的插入算法》
《AVL树的插入算法》
《AVL树的插入算法》
《AVL树的插入算法》

在四种旋转里面,我有一些心得我们的目的是把所有结点变平衡。当有结点需要成为新的头结点时,我们要注意它是否有左右子树。如果有,我们按照AVLTree的性质不难看出,如果是左子树,就把其挂到新的左子树的右边;如果是右子树,就把其挂到新的右子树的左边。
在最终的bf调整上,可以分为两类:
单旋转一类,以右旋转为例。
我们D结点的左右子树高度没变所以D的bf不变。A调整前bf是-2,我们把它挂到自己左树的右树上,相当于它左树高度降2.A的bf=0;由于A+C的高度一定和D相等所以B的bf=0.左旋转同理。

双旋转一类,以先右后左为例。
又分三类,举例说明。
1>当D结点的bf=0时,A的bf=0;
2> bf=-1时,由于需要把D结点的左子树挂在A结点的右树下平衡了A的左树,此时A的bf=0。
3> bf=1时,D结点的左子树的高度小于右子树,则肯定小于A的左子树。A的bf=-1.
B结点的同理可得。
先左后右旋转同理可得。
《AVL树的插入算法》

如有错误,还请指教。

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