平衡二叉查找树
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
介绍
计算机科学发展至今,已经出现了若干种平衡二叉查找树,其中最先发明的是 AVL 树。
所有平衡树基本由以下三个特征组成:
1.自平衡条件
2.旋转操作
3.旋转的触发
平衡树通过设置合理的自平衡条件,使得二叉排序树的查找、插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找、插入等操作时进行判断,如果满足其中某个旋转的触发条件,则进行对应的旋转操作。
一、自平衡条件
AVL 树提出了一个概念:平衡因子(balance factor)。每个结点的平衡因子是指它左子树最大高度和右子树最大高度的差。在 AVL 树中,平衡因子为 -1−1、00、11 的结点都被认为是平衡的,而平衡因子为 -2−2、22 等其他值的结点被认为是不平衡的,需要对这个结点所在子树进行调整
对结点 4 来说,平衡因子为 |height(left) - height(right)|=|3-1|=2>1,所以不平衡
二、旋转操作
在 AVL 树中,一共有两种单旋操作:左旋和右旋。AVL 树通过一系列左旋和右旋操作,将不平衡的树调整为平衡树。
左旋操作的演示如下:
通过进行左旋操作,使得原先的根 4变成了其左孩子2的右孩子,而 2 原先的左孩子 3变成了 4 的左孩子。
对应的,右旋操作的演示如下:
通过右旋操作,使得原先的根 5变成了其左孩子 3 的右孩子,而 3 原先的右孩子变成了 5 的左孩子。
多旋
AVL 树中还有两种复合旋转操作(即“多旋”),由两次单旋操作组合而成
第一种是左旋加右旋:
第二种是右旋加左旋:
三、旋转的触发
插入操作
在插入一个元素后不断回溯的过程中,如果因此导致结点不平衡,则根据不平衡情况(一定是一边子树比另一边子树的高度大 2)进行对应的旋转:
1.左子树比右子树的高度大 2:
如果新增元素插入到左儿子的左子树中,则进行右旋操作。(LL 型调整)
如果新增元素插入到左儿子的右子树中,则进行左旋加右旋操作。(LR 型调整)
2.右子树比左子树的高度大 2:
如果新增元素插入到右儿子的右子树中,则进行左旋操作。(RR 型调整)
如果新增元素插入到右儿子的左子树中,则进行右旋加左旋操作。(RL 型调整)
删除操作
类似的,在删除一个元素后不断回溯的过程中,如果因此导致结点不平衡,则和插入操作采用相同的调整操作,确保在删除以后整棵树依然是平衡的。