平衡二叉树(Height-Balanced Binary Search Tree):他也是一种二叉排序树。平衡二叉树是一颗空树或者其中每个结点的左子树和右子树的高度差最多等于1的二叉排序树.这个解决平衡二叉树的算法是由两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis在1962年共同发明的,所以平衡二叉树也简称为AVL树。
平衡因子: 将二叉树上结点的左子树深度减去右子树高度的值称为平衡因子BF(Balanced Factor).那么平衡二叉树上所有结点的平衡因子只能是-1,0,1.
平衡二叉树实现原理:在构建二叉排序树的过程中,每当插入一个节点值,先检查是否因插入而破环了树的平衡性,如果破坏了就找出最小不平衡子树。在保持二叉排序树的前提下,调整最小不平衡子树种各个结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
原平衡二叉树的平衡被打破后的四种旋转方法:
假设最小不平衡子树的根节点为被破坏结点,新插入的结点叫做破坏节点
1.RR旋转(右单旋):破坏结点在被破坏节点的右子树的右边,因而叫做RR插入。
2.LL旋转(左单旋):破坏节点在被破坏节点的左子树的左边,因而叫做LL插入。
3.LR旋转:破坏结点在被破坏节点的左子树的右边,因而叫做LR插入。
4.RL旋转:破坏节点在被破坏节点的右子树的左边,因而叫做RL插入。
上述四种旋转方式是根据结点的插入位置来命名的,有点绕口。我们不妨这样理解:
当进行RR插入时,就进行左旋 *** 作。也就是对被破坏节点进行逆时针旋转,然后根据二叉排序树的特性对一些结点进行调整。
当进行LL插入时,就进行右旋 *** 作。也就是对被破坏节点进行顺时针旋转,然后根据二叉排序树的特性对一些结点进行调整。
当进行RL插入时,就进行双旋 *** 作。也就是先对最小不平衡子树中以被破坏结点为根节点的子树中做一次右旋转 *** 作,以便让bf值和被破坏结点的bf值符号相同。然后对整颗最小不平衡子树做一次左旋转 *** 作。
当进行LR插入时,就进行双旋 *** 作。也就是先对最小不平衡子树中以被破坏结点为根节点的子树中做一次左旋转 *** 作,以便让bf值和被破坏结点的bf值符号相同。然后对整颗最小不平衡子树做一次右旋转 *** 作。
假设n个结点,则一颗平衡二叉树的深度为log以2为底n的对数。因而深度的数量级为logn。所以平衡二叉树的查找,删除,插入时间复杂度都为O(logn)。
插入序列:12, 4, 1, 7, 8, 10, 9, 2, 11, 6, 51、先插入12成为根
2、插入4在12的左子树,没有旋转
3、插入1在4的左子树,以4为中心向右单旋转,结果如下:
4
/ \
112
4、插入7在12的左子树,没有旋转
5、插入8在7的右子树,以8开始先左后右双旋转,结果如下:
4
/ \
18
/ \
7 12
6、插入10在12左子树,以8为中心开始向左单旋转,结果如下:
8
/ \
4 12
/ \ /
1 7 10
7、插入9在10 的左子树,以10为中心向右单旋转,结果如下:
8
/ \
4 10
/ \ / \
1 7 912
8、插入2在1的右子树,没有旋转
9、插入11在12 的左子树,没有旋转
10、插入6在7的左子树,没有旋转
11、插入5在6的左子树,以6为中心向右单旋转,结果如下:
8
/ \
4 10
/\ / \
1 6 912
\ / \/
2 5 7 11
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)