AVL平衡二叉查找树

AVL树:左旋与右旋

AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL 旋转"

假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可归纳为下列四种情况:

1.单向右旋平衡处理RR:由于在*a的左子树根结点的左子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;

2.单向左旋平衡处理LL:由于在*a的右子树根结点的右子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;

3.双向旋转(先左后右)平衡处理LR:由于在*a的左子树根结点的右子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。

4.双向旋转(先右后左)平衡处理RL:由于在*a的右子树根结点的左子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作。

 

 

中间为界,左边的深度与右边的深度差的绝对值不大于1,大于1 的就需要进行旋转,规则是上面的1、2、3、

 

 

 

 

 

 上面5个二叉树的结构中,

1.16就一个根节点,所以是平衡的,左右深度的绝对值差是0

2.16的左侧深度是1,右侧深度是0,所以差值是1

3,16的左侧深度是2,右侧深度是0,差值是2

4,16的左侧深度是0,右侧深度是1,差值是-1

5,16的左侧深度是0,右侧深度是2,差值是-2

3是LL型,调整的规则如下

5是RL型,调整的规则如下

其实最终的目标是左三变成根加左右,右三变成根加左右,而且是左边小于根小于右边

 

 

插入1-9到AVL树的过程是:

 

 

9个数,层高已经变成4层,如果数据量太大,那么层高太高,增加查询的深度

 

 

缺点:(mysql没用它作为索引结构的原因)

 做个练习题:16、3、7、11、9、26、18、14、15

 

 

 前面没什么问题,一直走到这里,需要注意了7与16的都需要调整了,

 

调整后如下

 

 

 

 

 然后这里需要调整7了,

不管9,只看7的“关键路径”上的节点,即对3、7、11、16、26进行调整,注意这里是调整的根节点是7,需要对7-11-16调整,调整三个数

 

 

 

 

 形成上面的结构后,然后把9按照正常的二叉树的规则放到7的右边

 

 然后

 

posted @ 2021-11-10 15:22  托马斯骨头收集  阅读(26)  评论(0编辑  收藏  举报