平衡二叉查找树(AVL树)总结

1. AVL树定义

解析:它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1、0和1。

 

2. AVL树旋转      

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

《平衡二叉查找树(AVL树)总结》

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

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

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

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

 

3. AVL树插入

解析:当在AVL树插入结点而失去平衡时,仅需对最小不平衡子树进行平衡旋转处理。如下所示:

(1)若AVL为空树,则插入一个数据元素为e的新结点作为AVL的根结点,树的深度增1;

(2)若e的关键字和AVL的根结点的关键字相等,则不进行插入;

(3)若e的关键字小于AVL的根结点的关键字,而且在AVL的左子树中不存在和e有相同关键字的结点,则将e插入在AVL的左子树上,并且当插入之后的左子树深度增加(+1)时,如下所示:

(a)AVL根结点平衡因子为-1(右子树的深度大于左子树的深度),则将根结点平衡因子更改为0,AVL深度不变;

(b)AVL的根结点的平衡因子为0(左、右子树的深度相等),则将根结点的平衡因子更改为1,AVL的深度增1;

(c)AVL的根结点的平衡因子为1(左子树的深度大于右子树的深度),若AVL的左子树根结点的平衡因子为1,则需进行单向右旋平衡处理,并且在右旋处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变;

(4)若e的关键字大于AVL的根结点的关键字,而且在AVL的右子树中不存在和e有相同关键字的结点,则将e插入在AVL的右子树上,并且当插入之后的右子树深度增加(+1)时,其处理操作和(3)中所述相对称。

说明:若AVL的左子树根结点的平衡因子为-1,则需进行先向左、后向右的双向旋转平衡处理,并且在旋转处理之后,修改根结点和其左、右子树根结点的平衡因子,树的深度不变。

 

4. AVL树查找和删除

解析:

(1)AVL树查找:AVL树查找与二叉查找树基本相同。

(2)AVL树删除:叶子结点;左子树或右子树有一个为空;左右子树都不空。

说明:从AVL树中删除,可以通过把要删除的节点向下旋转成一个叶子节点,接着直接移除这个叶子节点来完成。

 

参考文献:

[1] 数据结构[C语言版]

[2] AVL:An algorithm for the organization of information

[3] AVL树:https://zh.wikipedia.org/wiki/AVL树 

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